/*
题意:
1、给出N和首地址
2、然后给出静态链表
要求按key从小到大排列
解题:
1、按要求输入
2、排序倒是没什么问题,但是如何修改next
learn && wrong:
1、如何排序呢——排序后输出I+1的address,服了
2、注意用if(count != -1),特例输出-1,记住就像最后一个不要空格就行了
3、题目存在无效节点,不过没关系
4、需要特判,0 -1的情况
5、还有,先读入address,然后再address,加data,next,在修改address流程
6、输出要用count统计一下
7、流程:全部置为false-读入-while循环-特判输出
*/
include <iostream>
include <cstdio>
include <algorithm>
using namespace std;
const int maxn = 100010;
struct Node{
int data;
int address;
int next;
bool flag;
}node[maxn];
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()
{
for(int i = 0;i < maxn;i++){
node[i].flag = false;
}
int n, begin,address;
scanf("%d%d",&n,&begin);
for(int i = 0;i < n;++i){ //输入所有链表!!!
scanf("%d",&address);
scanf("%d%d",&node[address].data,&node[address].next);
node[address].address = address;
}
int count = 0,p = begin;
//枚举链表,对flag进行标记,同时计数有效节点个数(步骤3)
while(p != -1){ //!!!
node[p].flag = true;
count++;
p = node[p].next;
}
if(count == 0){ //特判,表中没有节点
cout<<"0 -1"<<endl;
}else{
//筛选有效节点,并按data从小到大排序(步骤4
sort(node,node + maxn,cmp);
printf("%d %05d\n",count,node[0].address); //防止-1被%05d化,提前判断
for(int i = 0;i < count;i++){
if(i != count - 1){
printf("%05d %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;
}
网友评论