//List.h

#include <iostream>
typedef int dataType; struct Node{
Node():data(),pNextNode(NULL){} //结点构造函数
dataType data;
Node* pNextNode;
};
class List{
private:
Node *head; //作为链表唯一的头指针
int size; //链表长度
public:
List(){head=new Node;size=;}
bool isEmpty(); //判断是否空表
bool InsertList(int i,dataType elem);  //i的指标从1开始,而不是从0开始
void PushList(dataType elem);   //在链表尾部添加元素
bool DeleteList(int i); //删除指定位置的元素
void ClearList(); //清除整条链表
void DeleteRepetitiveData();//删除重复元素
void PrintList(); //按顺序输出链表
int GetSize();
Node* Fine(int i); //找到第i个结点并返回该结点的指针
Node* FinePre(int i); //找到第i个结点前的结点,返回指针
};

//List.cpp

#include "List.h"
#include <iostream>
#include <vector>
using namespace std;
//判断空表
bool List::isEmpty(){
if(head==NULL)
return false;
else
return true;
}
//在第i位插入数据
bool List::InsertList(int i,dataType elem){
if (i<)
return false;
else if(head==NULL||i==)//如果是空表
{
head->data=elem;
size++;
return true;
}
else if (i>size) //位标大于链表长度时,在尾部添加
{
PushList(elem);
return true;
}
else
{
Node *pre=Fine(i-);
Node *follow=Fine(i);
Node *s=new Node; //为新结点申请内存
pre->pNextNode=s; //连接前结点
s->pNextNode=follow; //连接后结点
s->data=elem;
size++;
return true;
}
}
//在尾部添加元素
void List::PushList(dataType elem){
if(head==NULL)
{
head=new Node;
head->data=elem;
size++;
}
else
{
Node *cur=head;
while(cur->pNextNode)
cur=cur->pNextNode;
Node *s=new Node;
cur->pNextNode=s;
s->data=elem;
size++;
}
}
//打印链表
void List::PrintList(){
Node *cur=head;
while (cur!=NULL)
{
cout<<cur->data<<" ";
cur=cur->pNextNode;
}
cout<<endl;
}
//size
int List::GetSize(){
return size;
}
//找到第i个结点
Node* List::Fine(int i){
if(i==)
return head;
else
{
Node *cur=head;
for (int pos=;pos<i;pos++)
cur=cur->pNextNode;
return cur;
}
}
//找到i的前一个个结点
Node* List::FinePre(int i){
if(i<)
{
cout<<"参数必须大于等于2!"<<endl;
return NULL;
}
else if(i==)
return head;
else
return Fine(i-);
}
//删除第i个元素
bool List::DeleteList(int i){
if (i<||i>size) //限制i的范围
return false;
else if(i==)
{
Node *temp=head;
head=head->pNextNode;
delete temp;
size--;
return true;
}
else
{
Node *cur=this->Fine(i);
Node *pre=this->FinePre(i);
pre->pNextNode=cur->pNextNode; //重新连接结点
delete cur;
size--;
return true;
}
}
//清空整个链表
void List::ClearList(){
Node *temp=head;
while (head!=NULL)
{
temp=head;
head=head->pNextNode;
delete temp;
}
size=;
}
//删除重复元素
void List::DeleteRepetitiveData(){
int flag=; //代码运行标志,0为未运行
if(size==) //只有一个元素时跳出
return;
Node *stand=head;//内循环结束后或者找到相同数据后才会指向下个结点
Node *cursor; //游标
vector<int>storge;
for (int i=;i<size;i++)
{ //用for循环是因为要得到被删除元素的位置
//采用握手式比较,算法的时间复杂度为O(n^2)
cursor=stand->pNextNode;
flag=;
while(cursor!=NULL)
{
if(stand->data==cursor->data)
{
stand=stand->pNextNode;
flag=;
//将重复的数据的下标降序保存起来
storge.insert(storge.begin(),i+);
break;
}
else
cursor=cursor->pNextNode;
}
if(!flag)
stand=stand->pNextNode;
}
int itemp=storge.size();
while (itemp--)
{
this->DeleteList(storge.at());//提取下标,释放多余结点
storge.erase(storge.begin());
}
storge.clear();    //释放vector内存
}

//main.cpp

#include "List.h"
#include <iostream>
using namespace std; void main(){
//List类测试代码
List list;
list.InsertList(,);
list.InsertList(,);
list.InsertList(,);
list.InsertList(,);
list.PrintList(); //打印这4个元素
cout<<"链表的长度为:"<<list.GetSize()<<endl;
cout<<"现在删除第2个元素"<<endl;
list.DeleteList();
list.PrintList();
cout<<"现在清空链表"<<endl;
list.ClearList(); //清空链表
cout<<"输出空表:"<<endl;
list.PrintList(); list.PushList();
list.PushList();
list.PushList();
list.PushList();
list.PushList();
list.PushList();
list.PushList(); //压入4 1 7 1 1 2 2
cout<<"输出链表新加入的元素:"<<endl;
list.PrintList();
cout<<"删除相同元素后的链表为:"<<endl;
list.DeleteRepetitiveData();
list.PrintList();
} /*
总结:
1.链表类应该先写Fine()和FindPre(),再写插入和删除
2.链表的结构应该给每一个结点加上一个下标。因为下标在
操作时再加上的话,元素跟下标是不统一的,
如果有元素被删除,下标将要重新分配。
 这就导致void List::DeleteRepetitiveData()不能用
 相对直接的方法在检测到重复数据时就删除数据,而要借助vector
间接删除
*/

c++ 链表删除重复的数据的更多相关文章

  1. SQL:一句话删除重复的数据

    --构造原始数据 )) --插入数据 INSERT INTO #T (N)VALUES ('A') --方式一:一句话删除重复数据(无主键) --方式二:采用CTQ,with的写法删除 ;

  2. ORACLE 删除重复的数据

    内容转自:https://www.cnblogs.com/zfox2017/p/7676237.html         查询及删除重复记录的SQL语句   1.查找表中多余的重复记录,重复记录是根据 ...

  3. sqlserver删除重复的数据

    分享链接: http://blog.csdn.net/s630730701/article/details/52033018 http://blog.csdn.net/anya/article/det ...

  4. 082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II

    给定一个有序的链表,删除所有有重复数字的节点,只保留原始列表中唯一的数字.例如:给定 1->2->3->3->4->4->5 ,则返回 1->2->5给 ...

  5. SQLServer一次性删除重复的数据

    delete from [GCPCore].[GCP.Product].[CityMall] where  AreaID in(select AreaID from [GCPCore].[GCP.Pr ...

  6. ROWID-Oracle中删除重复行数据

    DELETE FROM DEPT_BAK WHERE ROWID NOT IN (SELECT MIN(ROWID) RID FROM DEPT_BAK GROUP BY DEPTNO,DNAME,L ...

  7. openquery链表删除时报错 “数据提供程序或其他服务返回 E_FAIL 状态”

    DELETE OPENQUERY (VERYEAST_COMPANY_MYSQL_CONN, 'SELECT * FROM company ') WHERE c_userid in(select c_ ...

  8. 链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while

    public static boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return fals ...

  9. sql server删除重复的数据保留一条

    DELETE FROM [TCX_1710_SHZJ].[dbo].[PR_BindingTray] WHERE 1=1 AND SNum in (SELECT * FROM ( (SELECT SN ...

随机推荐

  1. SpringMVC——从HelloWorld

    学习SpringMVC——从HelloWorld开始   前言: 时隔十二年,中国女排最终过关斩将,用3:1的成绩证明了自己的实力,霸气夺冠,为中国赢得了一枚意义非常的金牌.这是一次全民的狂欢,一场视 ...

  2. app 测试点

    以下所有测试最后必须在真机上完整的执行1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试3.升级测试 数字签名.升级覆盖安装.下载后手动覆盖安 ...

  3. Linux下使用QQ的几种方式

    Linux下没有官方的QQ聊天应用,对于经常使用QQ与朋友同事沟通交流的小伙伴们来说肯定很不方便,在Linux下可以使用以下几种方法使用QQ:   1.wine qq for linux Ubuntu ...

  4. 最新Android 出现Please ensure that adb is correctly located at问题的解决方法

    最近经常遇到下面的问题 遇到问题描述: 运行android程序控制台输出: [2013-07-23 17:28:06 - ] The connection to adb is down, and a  ...

  5. [LeetCode 109] - 将已排序链表转换为二叉搜索树 (Convert Sorted List to Binary Search Tree)

    问题 给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树. 初始思路 二叉搜索树高度平衡,意味着左右子树的高度要平衡.根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我 ...

  6. IBM Cognos 10 启动报错

    报错信息: 15:35:02, 'LogService', 'StartService', 'Success'. 15:35:03, CAF input validation enabled. 15: ...

  7. 黑马程序员_Java集合Map

    Map Map概述: 接口Map<k,v> 类型参数: k-此映射所维护的键的类型 v-映射值的类型 Map集合:该集合存储键值对.一对一对往理存.而且要保证键的唯一性. 嵌套类摘要: s ...

  8. Android UI 之TextView控件属性列表

    在网上收集到了TextView 的属性,在开发过程中还是挺有用的. android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(non ...

  9. 【2013南京区域赛】部分题解 hdu4802—4812

    上周末打了一场训练赛,题目是13年南京区域赛的 这场题目有好几个本来应该是我擅长的,但是可能是太久没做比赛了各种小错误代码写的也丑各种warusn trush搞得人很不爽 全场题之一的1002也没有想 ...

  10. Havel定理

    先贴一个百度百科的注释 Havel定理编辑 本词条缺少概述.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 中文名 Havel定理 外文名 Canisters theorem 特    ...