0
点赞
收藏
分享

微信扫一扫

1052 Linked List Sorting (25 分)

程序猿不脱发2 2022-02-04 阅读 32

在这里插入图片描述
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;
}
举报

相关推荐

0 条评论