单链表删除重复数据
在日常的学习生活中,突然有一次实验报告让我写一个单链表删除重复数据的实验,就记录一下。
预定义:
sLinkNode.h
#include <malloc.h>
#include <stdio.h>
typedef int ElemType;
typedef struct node
{ ElemType data; //数据域
struct node *next; //指针域
} SLinkNode; //单链表类型
void InitList(SLinkNode *&L) //L作为引用型参数
{ L=(SLinkNode *)malloc(sizeof(SLinkNode)); //创建头结点*L
L->next=NULL;
}
void DestroyList(SLinkNode *&L)
{ SLinkNode *pre=L,*p=pre->next;
while (p!=NULL)
{ free(pre);
pre=p; p=p->next; //pre、p同步后移
}
free(pre);
}
void DispList(SLinkNode *L) //输出单链表
{ SLinkNode *p=L->next;
while (p!=NULL)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//采用头插法建表的算法
void CreateListF(SLinkNode *&L,ElemType a[],int n)
{ SLinkNode *s; int i;
L=(SLinkNode *)malloc(sizeof(SLinkNode)); //创建头结点
L->next=NULL; //头结点的next域置空,表示一个空单链表
for (i=0;i<n;i++) //遍历a数组所有元素
{ s=(SLinkNode *)malloc(sizeof(SLinkNode));
s->data=a[i]; //创建存放a[i]元素的新结点*s
s->next=L->next; //将*s插在头结点之后
L->next=s;
}
}
//采用尾插法建表的算法
void CreateListR(SLinkNode *&L,ElemType a[],int n)
{ SLinkNode *s,*tc; int i;
L=(SLinkNode *)malloc(sizeof(SLinkNode)); //创建头结点
tc=L; //tc始终指向尾结点,开始时指向头结点
for (i=0;i<n;i++)
{ s=(SLinkNode *)malloc(sizeof(SLinkNode));
s->data=a[i]; //创建存放a[i]元素的新结点*s
tc->next=s; //将*s插入*tc之后
tc=s;
}
tc->next=NULL; //尾结点next域置为NULL
}
主函数:
#include "stdio.h"
#include "stdlib.h"
#include "SLinkNode.h"
void linkdel(SLinkNode *&L) //单链表中删除重复元素
{
SLinkNode *p=L;
if(p->next==NULL||p->next->next==NULL)
return;
while(p->next!=NULL)
{
SLinkNode *s=p->next->next,*pre=p->next;
p=p->next;
while(pre->next!=NULL)
{
if(s->data==p->data)
{
pre->next=s->next;
s=s->next->next;
}
else
{
pre=s;
s=s->next;
}
}
}
}
void insert(SLinkNode *&L,ElemType x)
{
int i = 0;
SLinkNode *s,*p=L->next,*pre=L;
while(p->next!=NULL)
{
if(x<p->data)
{
s=(SLinkNode*)malloc(sizeof(SLinkNode));
s->data=x;
s->next=p;
pre->next=s;
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p->next==NULL)
{
s=(SLinkNode*)malloc(sizeof(SLinkNode));
s->data=x;
p->next=s;
s->next=NULL;
}
}
void Reverse(SLinkNode *&L)
{ SLinkNode *p=L->next,*q;
L->next=NULL;
while (p!=NULL)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
int main()
{
ElemType x;
SLinkNode *L;
SqList M;
ElemType a[]={99,99,77,66,55,33,33,22,11};
CreateListR(L,a,9); /*尾插入法建立带头结点的单链表,请补充完整*/
DispList(L); /*打印函数*/
linkdel(L);
DispList(L);
// DispList (L); /*输出原链表*/
//Reverse(L); /*倒置单链表*/
//insert(L,100);
//DispList (L); /*输出倒置后的链表*/
DestroyList(L); /*释放带头结点的单链表*/
return 0;
}