超详解析,手打不易,转载注明出处,点赞收藏,多谢支持
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
struct LNode{
long data; //当前键值
long next_address; //下一个结点地址
}LNodes[100001];
int main(){
long head = -1; //去重后的链表起始结点
long del = -1 //被删除的链表起始结点
long n;
int Num[100001] = {0}; // 0 代表未出现该键值 数组下标代表键值
scanf("%ld %ld",&head,&n);
for(int i=0;i<n;i++){ //输入
long address;
scanf("%ld",&address);
scanf("%ld %ld",&LNodes[address].data,&LNodes[address].next_address);
}
long p_head = head;
long H_tail = -1; //去重后的链表 最后的地址
long D_tail = -1; //被删除后的链表 最后的地址
while(p_head != -1){
long i = LNodes[p_head].data;
if(!Num[abs(i)]){ //查看 键值 是否已出现过 abs():取绝对值函数
Num[abs(i)] = 1; //没出现,则质1,代表出现
if(H_tail != -1) //为去重后的链表上一个结点的下一个结点地址赋值当前结点地址
LNodes[H_tail].next_address = p_head;
H_tail = p_head; //使去重后的链表的最后结点为当前结点
}else{
if(D_tail != -1) //为被删除后的链表上一个结点的下一个结点地址赋值当前结点地址
LNodes[D_tail].next_address = p_head;
if(D_tail == -1)del = p_head; //若被删除后的链表为空,则头结点地址为当前地址
D_tail = p_head; //使被删除后的链表的最后结点为当前结点
}
p_head = LNodes[p_head].next_address; //下一个结点
}
//使两个链表最后结点的下一个结点地址为-1
LNodes[H_tail].next_address = -1;
LNodes[D_tail].next_address = -1;
//打印输出
while(head != -1){
printf("%05ld %ld",head,LNodes[head].data);
printf(LNodes[head].next_address!=-1?" %05ld\n":" %ld\n",LNodes[head].next_address);
head = LNodes[head].next_address;
}
while(del != -1){
printf("%05ld %ld",del,LNodes[del].data);
printf(LNodes[del].next_address!=-1?" %05ld\n":" %ld\n",LNodes[del].next_address);
del = LNodes[del].next_address;
}
}