/* 链表删除相同元素,分别演示了两种建表方法和两种删除方法
首先用前插法建表,而后采取找一个相同的删除一个的方法;
然后用后接法建表,而后采取找到所有多余的相同元素一次性删除;
*/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
main()
{
/*链表定义*/
struct LNODE{
int data;
struct LNODE *next;
};
typedef struct LNODE LNode;
typedef struct LNODE *LinkList;
LinkList l=NULL;/*链表头指针*/
/*各结点数据*/
int a[10]={1,2,3,3,3,4,5,5,6,7};
int i;/*for语句临时变量*/
LinkList p=NULL;/*临时变量*/
LinkList q=NULL;/*临时变量*/
/*前插法建表*/
l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
for(i=0;i<10;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=a[i];
p->next=l->next;
l->next=p;
}
/*输出整个链表内容*/
p=l->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("/n");
/*逐个删除重复相同元素*/
p=l->next;
if(!p)
return 0;/*空表*/
q=p->next;
if(!q)
return 0;/*只有一个元素*/
while(q)
{
if(p->data!=q->data)
{
p=p->next;
q=q->next;
}
else
{
p->next=q->next;
free(q);
q=p->next;
}
}
/*输出整个链表内容*/
p=l->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("/n");
/*后接法建表*/
p=l->next;
l->next=NULL;
free(p);
q=l;
for(i=0;i<10;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=a[i];
p->next=NULL;
q->next=p;
q=p;
}
/*输出整个链表内容*/
p=l->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("/n");
/*一次性删除所有重复相同元素*/
p=l->next;
if(!p)
return 0;/*空表*/
q=p->next;
if(!q)
return 0;/*只有一个元素*/
while(q)
{
if(p->data!=q->data)
{
p=p->next;
q=q->next;
}
else
{ /*q指向最后一个相同元素*/
while(q->next->data==p->data)
q=q->next;
p->next=q->next;
free(q);
q=p->next;
}
}
/*输出整个链表内容*/
p=l->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("/n");
getch();
}