L2-002 链表去重
链表问题
#include <stdio.h> // 标准输入输出库,用于 scanf 和 printf
#include <stdlib.h> // 标准库,用于 abs 函数
#include <stdbool.h> // 布尔类型支持,用于 bool、true、false
#define MAX_ADDRESS 100000 // 最大地址范围,用于数组大小
#define MAX_KEY 10000 // 键值绝对值的最大值,用于 visited 数组大小
// 定义链表节点结构
typedef struct Node {
int address; // 节点地址
int key; // 节点键值
int next; // 下一个节点的地址
} Node;
// 定义全局变量
Node nodes[MAX_ADDRESS]; // 存储所有节点,以地址为索引
bool visited[MAX_KEY]; // 记录键值绝对值是否已访问
Node uniqueList[MAX_ADDRESS]; // 去重后的链表
Node removedList[MAX_ADDRESS]; // 被删除的链表
int main() {
int head, N; // head 是链表头节点地址,N 是节点总数
scanf("%d %d", &head, &N); // 输入链表头节点地址和节点总数
// 读取所有节点信息
for (int i = 0; i < N; i++) {
int address, key, next; // 当前节点的地址、键值和下一个节点地址
scanf("%d %d %d", &address, &key, &next); // 读取节点信息
nodes[address].address = address; // 存储节点地址
nodes[address].key = key; // 存储节点键值
nodes[address].next = next; // 存储下一个节点地址
}
// 初始化 visited 数组,记录键值绝对值是否已访问
for (int i = 0; i <= MAX_KEY; i++) {
visited[i] = false; // 初始化为未访问
}
int uniqueCount = 0; // 去重后链表的节点数量
int removedCount = 0; // 被删除链表的节点数量
int current = head; // 当前节点地址,从链表头开始
// 遍历链表
while (current != -1) { // 当前节点地址不为 -1(链表未结束)
int keyAbs = abs(nodes[current].key); // 当前节点键值的绝对值
if (!visited[keyAbs]) { // 如果键值绝对值未访问过
visited[keyAbs] = true; // 标记为已访问
uniqueList[uniqueCount++] = nodes[current]; // 加入去重后的链表
} else { // 如果键值绝对值已访问过
removedList[removedCount++] = nodes[current]; // 加入被删除的链表
}
current = nodes[current].next; // 移动到下一个节点
}
// 输出去重后的链表
for (int i = 0; i < uniqueCount; i++) {
printf("%05d %d ", uniqueList[i].address, uniqueList[i].key); // 输出节点地址和键值
if (i < uniqueCount - 1) { // 如果不是最后一个节点
printf("%05d\n", uniqueList[i + 1].address); // 输出下一个节点地址
} else { // 如果是最后一个节点
printf("-1\n"); // 输出 -1 表示链表结束
}
}
// 输出被删除的链表
for (int i = 0; i < removedCount; i++) {
printf("%05d %d ", removedList[i].address, removedList[i].key); // 输出节点地址和键值
if (i < removedCount - 1) { // 如果不是最后一个节点
printf("%05d\n", removedList[i + 1].address); // 输出下一个节点地址
} else { // 如果是最后一个节点
printf("-1\n"); // 输出 -1 表示链表结束
}
}
return 0; // 程序正常结束
}

