☰
7-2 链表去重 (15 分)(C语言版)
2026/10/10 7:46:17 网站建设 项目流程

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10^5 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过10^4的整数,下一个结点是下个结点的地址。

输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

00100599999-78765423854-15000008765415-100000-1599999001002123854

输出样例:

00100212385423854-159999999999-7-100000-15876548765415-1
#include<stdio.h>#include<math.h>typedefstructNode{intdate;intnext;}Node;intfirst[100005];// 存放第一条链表的地址intf=0;;intisVisited[100005];// 判断是否有重复,0代表未重复,1代表已存在intis=0;intlast[100005];// 存放第二条链表的地址intl=0;voidprint(Node arr[],intg[],intn);intmain(){Node arr[100005];inthead;// 首地址intn;intads;scanf("%d %d",&head,&n);for(inti=0;i<n;i++){scanf("%d",&ads);scanf("%d %d",&arr[ads].date,&arr[ads].next);}intp=head;while(p!=-1){is=abs(arr[p].date);// 取出键值的绝对值// 判断该键值是否存在if(!isVisited[is]){// 该键值不存在first[f++]=p;// 将该键值的地址放入第一条链表中isVisited[is]=1;// 将该键值位置置为1,表示已存在}else{// 该键值存在last[l++]=p;// 将该键值地址放入第二条链表中}p=arr[p].next;// 移向下一位置}print(arr,first,f);print(arr,last,l);return0;}voidprint(Node arr[],intg[],intn){for(inti=0;i<n;i++){if(i==n-1){printf("%05d %d -1\n",g[i],arr[g[i]].date);}else{printf("%05d %d %05d\n",g[i],arr[g[i]].date,g[i+1]);}}}

——————————————————————————————————————

时隔多年,再次写这道题:

#include<stdio.h>#include<stdlib.h>structnode{intpre;//前驱地址intdata;intnext;//后继地址};structnodelk[100000];//链表charf[100000];//标识是否出现过intmain(){intN;intstart;//链表起始地址ints;//被删掉的链表起始地址intaddress,num,nx;//地址,值,下一个结点的地址inta;inti,j,k;scanf("%d %d",&start,&N);for(i=0;i<N;i++){scanf("%d %d %d",&address,&num,&nx);lk[address].data=num;lk[address].next=nx;if(nx!=-1)lk[nx].pre=address;//记录结点的前驱地址}// 遍历链表,检查出绝对值重复的结点i=start;j=lk[start].next;s=-1;while(j!=-1){a=abs(lk[i].data);f[a]='1';a=abs(lk[j].data);if(f[a]=='1'){lk[i].next=lk[j].next;if(lk[j].next!=-1)lk[lk[j].next].pre=i;if(s==-1){s=j;k=j;}else{lk[k].next=j;lk[j].pre=k;k=j;}j=lk[i].next;}else{i=j;j=lk[j].next;}}lk[k].next=-1;// 输出i=start;while(i!=-1){if(lk[i].next==-1)printf("%05d %d -1\n",i,lk[i].data,lk[i].next);elseprintf("%05d %d %05d\n",i,lk[i].data,lk[i].next);i=lk[i].next;}i=s;while(i!=-1){if(lk[i].next==-1)printf("%05d %d -1\n",i,lk[i].data,lk[i].next);elseprintf("%05d %d %05d\n",i,lk[i].data,lk[i].next);i=lk[i].next;}return0;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询