//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. 我自己的style

    /** DATE:Time AUTHOR:Zoe TEAM:公司名称 INTRO:cssName **/ @charset "utf-8"; /*通用公共样式 开始*/ /* 清除 ...

  2. IE6\ IE7、IE8\9\10和Firefox的hack方式

    #test{color:red;color:red !important;/ Firefox.IE7支持 */_color:red; / IE6支持 */*color:red; / IE6.IE7支持 ...

  3. CSS5.4 安装问题集

    由于手痒,将5.2 卸载了,装了5.4 出现如下错误:install failed to install com.ti.ccstudio.debugserver.win32 corrctly. ... ...

  4. Install and use Karma

    1:安装karma y@y:~$ npm install --global karma 2:安装karma插件 y@y:~$ npm install --global karma-jasmine ka ...

  5. 在网页中获取 facebook page 的内容

    参考 : http://www.ibm.com/developerworks/cn/opensource/os-cn-facebookapi/ 1.首先你要有 facebook page, 内容要公开 ...

  6. MFC新婚之夜(笑昏,大概是指MFC的人固步自封)

    请问学会MFC都要学些什么呢?DOC-VIEW,OLE,UI线程,泵,钩,还是堆,栈内存分配与回收的机制?还是那些各种各样的CHAR,还是__cdecl, __stdcall,PASCAL等等,或者编 ...

  7. 利用http实现文件的上传和下载

    其他语言都比较方便,使用http上传.但是C++这样就差点,不过还好,Linux下有个curl的命令行工具,这是一个开源项目,底下有个子项目是libcurl,curl就是调用这个API实现的一系列ft ...

  8. Mysql auto_increment 重新计数(让id从1开始)

    当清空一个表的时候,重新插入数据,发现auto_increment属性的字段计数不是从1开始的时候,可以使用以下命令   方法一 delete from test; alter table `test ...

  9. git与svn对比

    git 与 svn 对比 git的使用不需要联机 SVN集中式版本控制:每个人的版本都是提交到服务器,服务器坏了就雪崩.git分布式版本控制:  安全,每人本地有个版本库,每个人都可以充当‘服务器 它 ...

  10. CSS常用操作-导航栏

    1.垂直导航栏 index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...