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