将一个链表中重复元素删除(只保留一个结点)
##代码如下
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
node *next;
}Node;
void Creat(Node *L)
{
node *s,*tc=L; //s表示插入元素,tc为尾指针
printf("请输入元素个数n:");
int n,i;
scanf("%d", &n);
while(n--){
s=(Node*)malloc(sizeof(Node));
scanf("%d",&s->data ); //输入元素
tc->next =s; //尾插法
tc=s;
}
tc->next =NULL;
}
int DisList(Node *L) //打印
{
if(L->next == NULL) return 0; //如果头结点下一个无元素,返回0
node *p=L->next ;
while(p != NULL){ //打印输出
printf("%d ", p->data );
p=p->next ;
}
printf("\n");
return 1;
}
int Delete(Node *L)
{
Node *pre,*tc;
Node *p=L->next ;
while(p != NULL){
pre=p; //保证pre为tc的前一个结点
tc=p->next;
while(tc != NULL){ //tc为p的前一个结点,从tc开始遍历
if(p->data == tc->data ){ //若tc与p相同,则进行删除操作
pre->next =tc->next ;
free(tc);
tc=pre->next;
continue; //删除完需要结束本次循环 ,否则下次的语句会导致跳过一个数删除的不全(例如222结果会变成22)
}
tc=tc->next ; //不相等的时候向前移动
pre=pre->next;
}
p=p->next ; //p遍历完,p前移再次遍历
}
}
int main()
{
Node *L=(Node*)malloc(sizeof(Node));
Creat(L);
Delete(L);
DisList(L);
return 0;
}