Sample Input:
5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345
Sample Output:
5 12345
12345 -1 00001
00001 0 11111
11111 100 22222
22222 1000 33333
33333 100000 -1
知识点:链表
//1052 Linked List Sorting(25 分)
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100005;
//步骤1:定义静态链表,其中结点性质bool型变量flag定义,表示为结点在链表中是否出现
// flag为false表示无效结点
struct Node { //定义静态链表
int address, data, next;
bool flag;//结点是否在链表上
}node[maxn];
//步骤3:对节点进行排序
bool cmp(Node a, Node b) {
if (a.flag == false || b.flag == false) {
return a.flag > b.flag;
}
else {
return a.data < b.data;
}
}
int main() {
//步骤2:初始化
for (int i = 0;i < maxn;i++) {
node[i].flag = false;
}
int n, begin, address;
scanf_s("%d%d", &n, &begin);
for (int i = 0;i < n;i++) {
scanf_s("%d", &address);
scanf_s("%d%d", &node[address].data, &node[address].next);
node[address].address = address;
}
int count = 0, p = begin;
//步骤3:枚举链表,对flag进行标记,同时计数有效结点个数
while (p != -1) {
node[p].flag = true;
count++;
p = node[p].next;
}
if (count == 0) { //特判:新链表中没有结点时输出 0 -1
printf("0 -1");
}
else {
//步骤4:筛选有效结点,并按data从小到大排序
sort(node, node + maxn, cmp);
//步骤5:输出结果
//防止-1被%05d化,提前判断
printf("%d %05d\n", count, node[0].address);
for (int i = 0;i < count;i++) {
if (i != count - 1) {
printf("%05 %d %05d\n", node[i].address, node[i].data, node[i + 1].address);
}
else {
printf("%05d %d -1\n", node[i].address, node[i].data);
}
}
}
return 0;
}