思路:使用静态链表
注意:存在给出的地址不在链表上,此外,存在链表没有任何节点。所以这个故事告诉我们,多想一下出题人要求我们输出内容的必要性,一般情况,出题人不会**让我们读入什么,就输出什么。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100006;
struct node{
	int key,add,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.key<b.key;
	}
}
int main(){
	int n,head,add;
	for(int i=0;i<maxn;i++){  //初始化 
		Node[i].flag=false;
	}
	scanf("%d%d",&n,&head);
	for(int i=0;i<n;i++){
		scanf("%d",&add);
		Node[add].add=add;
		scanf("%d %d",&Node[add].key,&Node[add].next);
	}
	int cnt=0,p=head;
	while(p!=-1){
		Node[p].flag=true;  //在链表上
		cnt++;
		p=Node[p].next; 
	}
	if(cnt==0){ //链表没有任何节点时 
		printf("0 -1\n"); 
		return 0;
	}
	sort(Node,Node+maxn,cmp);
	printf("%d %05d\n",cnt,Node[0].add);
	for(int i=0;i<cnt-1;i++){
		printf("%05d %d %05d\n",Node[i].add,Node[i].key,Node[i+1].add);
	}
	printf("%05d %d -1\n",Node[cnt-1].add,Node[cnt-1].key);
	return 0;
}