先读入所有的数据按地址存储在数组里。然后从首地址开始遍历整个单链表,将其复制到另外一个数组中。接着遍历第二个数组,把结果链表存放到第三个数组里,把除去链表存放到第四个数组里。不要忘记修改链表的next域。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <cmath>
const int N = 100000;
const int M = 10100;
struct node {
int address, key, next;
};
int main(void)
{
int n, i, start;
node tmp, *arr, *result, *remove;
arr = new node[N];
result = new node[N];
remove = new node[N];
scanf("%d %d", &start, &n);
for (i = 0; i < n; i++) {
scanf("%d %d %d", &tmp.address, &tmp.key, &tmp.next);
arr[tmp.address] = tmp;
}
int add = start, arrcnt = 0, resultcnt = 0, removecnt = 0;
while (add != -1) {
result[resultcnt++] = arr[add];
add = arr[add].next;
}
bool *appear = (bool *)calloc(M, sizeof(bool));
for (i = 0; i < resultcnt; i++) {
if (appear[abs(result[i].key)]) {
remove[removecnt++] = result[i];
}
else {
appear[abs(result[i].key)] = true;
arr[arrcnt++] = result[i];
}
}
if (removecnt) {
for (i = 0; i < removecnt - 1; i++) {
remove[i].next = remove[i + 1].address;
}
remove[removecnt - 1].next = -1;
}
if (arrcnt) {
for (i = 0; i < arrcnt - 1; i++) {
arr[i].next = arr[i + 1].address;
}
arr[arrcnt - 1].next = -1;
}
if (arrcnt) {
for (i = 0; i < arrcnt - 1; i++) {
printf("%05d %d %05d\n", arr[i].address, arr[i].key, arr[i].next);
}
printf("%05d %d %d\n", arr[i].address, arr[i].key, arr[i].next);
}
if (removecnt) {
for (i = 0; i < removecnt - 1; i++) {
printf("%05d %d %05d\n", remove[i].address, remove[i].key, remove[i].next);
}
printf("%05d %d %d\n", remove[i].address, remove[i].key, remove[i].next);
}
delete[] arr;
delete[] result;
delete[] remove;
free(appear);
return 0;
}