//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. innerHTML的运用

    <!doctype html> <html> <style> li{float:left;margin:0 100px;color:red;} </style ...

  2. ucenter 通信原理个人总结

    用户登陆discuz,调用on_login() , on_login ()里调用了userlogin() 验证用户信息,正确的话,调用uc_user_synlogin(),然后调用uc_api_pos ...

  3. iPhone开发:Objective C 代码规范-iOS总结版

    一,关于空行 A:.h中的空行 1,文件说明与头文件包涵(#import)之间空1行 2,头文件包涵(#import)之间,如果需要分类区别,各类别之间空1行 3,头文件包涵(#import)与@cl ...

  4. Android 用户登录

    1:服务端代码如下 <?php /** *登录成功就返回 1,否则返回 0 */ $REQUEST_METHOD=$_SERVER['REQUEST_METHOD']; if($REQUEST_ ...

  5. Yii数据库

    http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar http://zhengdl126.iteye.com/blog/1460779 ...

  6. BZOJ3297: [USACO2011 Open]forgot

    3297: [USACO2011 Open]forgot Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 54  Solved: 38[Submit][ ...

  7. MFC断点无效

    方法1: 将出问题的CPP文件用系统记事本notepad打开,然后另存时选择unicode编码保存,覆盖掉原来的文件即可.一般这种方法一般会解决VS断点无法设定的80%问题.没有办法才请出第2种方法. ...

  8. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  9. 运营总监招聘-e袋洗招聘-拉勾网

    运营总监招聘-e袋洗招聘-拉勾网 运营总监

  10. flume-agent实例

    flume    多种适配,多样化的数据收集    核心概念        event:一条消息        client:访问者        agent:            重要组件Sour ...