题目描述
分析:
首先先找出这条链表中存在的结点,也就是有效结点,利用flag判断结点是否有效,完后对结点进行排序,排序函数首先判断flag的值,按flag从大到小排序即把有效结点排在前面,完后按数据从小到大排序,输出注意-1的输出。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
int address,data,next;
bool flag;
}n[100005];
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<100005;i++){
n[i].flag=false;
}
int x,start;
scanf("%d%d",&x,&start);
int address,data,next;
for(int i=0;i<x;i++){
scanf("%d%d%d",&address,&data,&next);
n[address].data=data;
n[address].next=next;
n[address].address=address;
}
int num=0,p=start;
while(p!=-1){
n[p].flag=true;
p=n[p].next;
num++;
}
if(num==0){
printf("0 -1");
}
else{
sort(n,n+100005,cmp);
printf("%d %05d\n",num,n[0].address);
for(int i=0;i<num;i++){
if(i!=num-1){
printf("%05d %d %05d\n",n[i].address,n[i].data,n[i+1].address);
}
else{
printf("%05d %d -1\n",n[i].address,n[i].data);
}
}
}
return 0;
}