真的是我太菜了!欢迎大佬指点。
链表去重
作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤10^5,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过10
的整数,下一个结点是下个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct LNode
{
int ad, data, next;
};
int main()
{
int st, n;
int i, j, k=0;
LNode* list;
scanf("%d %d", &st, &n);
list = (LNode*)malloc(sizeof(LNode) * n);
for (int i = 0; i < n; i++)
scanf("%d %5d %d",
&list[i].ad, &list[i].data, &list[i].next);
for (i = 0; i < n; i++)
{ //把ad开头的数据置换过去
if (list[i].ad == st)
{
LNode t = list[0];
list[0] = list[i];
list[i] = t;
}
}
for (i = 0; i < n; i++)
{ //按ad, next为数据排序
for (j = 1; j < n; j++)
{
if (list[i].next == list[j].ad)
{
LNode t1 = list[i+1];
list[i+1] = list[j];
list[j] = t1;
}
}
}
for (i = 0; i < n; i++)
{ //查重
for (j = i + 1; j < n; j++)
{
if (abs(list[i].data) == abs(list[j].data))
{
if (j + 1 < n-1)
{
list[j - 1].next = list[j].next;
list[j].next = list[j + 1].next;
list[j + 1].next = list[j].ad;
LNode t2 = list[j];
list[j] = list[j + 1];
list[j + 1] = t2;
k++;
}
}
}
}
for (i = 0; i < n - k-2; i++)
{
printf("%05d %d %05d\n",
list[i].ad, list[i].data, list[i].next);
}
printf("%05d %d -1\n",
list[n - k - 2].ad, list[n - k - 2].data);
for (i = k+2; i < n-1; i++)
{
printf("%05d %d %05d\n",
list[i].ad, list[i].data, list[i].next);
}
printf("%05d %d -1\n",
list[n - 1].ad, list[n - 1].data);
}
结果:(13/25)