/*
时间:2020/08/08
目的:删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
功能:利用链表解决一些实际问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct list{
int val;
struct list *pnext;
}NODE,*PNODE;
int main()
{
PNODE pHead;
int len;
printf("输入链表的元素个数:");
scanf("%d",&len);
pHead=creatlist(len);
trase(sort(pHead));
return 0;
}
PNODE creatlist(int len){
PNODE pHead=(PNODE)malloc(sizeof(NODE)),p=pHead;
int i,j,val;
for(i=0;i<len;i++){
PNODE q=(PNODE)malloc(sizeof(NODE));
printf("输入值:");
scanf("%d",&val);
q->val=val;
p->pnext=q;
p=q;
}
p->pnext=NULL;
return pHead;
}
PNODE sort(PNODE pHead){
PNODE p,q,s,r;
int count=0;
for(p=pHead->pnext;p!=NULL;p=p->pnext){
s=p,r=pHead;
for(q=p->pnext;q!=NULL;q=q->pnext){
if(p->val==q->val){
s->pnext=q->pnext;
q->pnext=NULL;
q=s;//q往前移动,在执行q=q->pnext后才能指向s后面一个结点
count++;
}
else
s=s->pnext;
}
if(count!=0){
r->pnext=p->pnext;
p->pnext=NULL;
p=r;
count=0;
}
else
r=r->pnext;
}
return pHead;
}
void trase(PNODE pHead){
PNODE p=pHead->pnext;
while(p!=NULL){
printf("%d\t",p->val);
p=p->pnext;
}
}
/*
总结:比较简单,注意一些细节就好
-----------------------
在dev中输出结果为
输入链表的元素个数:5
输入值:3
输入值:9
输入值:3
输入值:7
输入值:9
7 正确
-----------------------
*/
【C语言】——删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素
最新推荐文章于 2021-06-21 23:40:12 发布