PAT:1052. Linked List Sorting (25) AC
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int address;
int data;
int next;
bool tag;
}Node[100066];
bool cmp(node a,node b)
{
if(a.tag!=b.tag)
return a.tag>b.tag;
else
return a.data<b.data;
}
int main()
{
memset(Node,0,sizeof(Node));
int n,front;
scanf("%d%d",&n,&front);
for(int i=0 ; i<n ; ++i) //记录节点
{
int now,data,next;
scanf("%d%d%d",&now,&data,&next);
Node[now].address=now;
Node[now].data=data;
Node[now].next=next;
}
int cnt=0,add; //记录有相关节点个数
for(add=front ; add!=-1 ; add=Node[add].next) //找到所有属于头结点链表的相关节点
{
++cnt;
Node[add].tag=1;
}
//输出
if(cnt==0) //特判没有节点的时候
{
printf("0 -1");
return 0;
}
sort(Node,Node+100066,cmp);
printf("%d ",cnt);
int tag=0;
for(int i=0 ; i<100066 ; ++i)
{
if(Node[i].tag==1) //按data升序,大的一定在后面,要遍历到100065,因为memset之后所有初始data都是0
{
--cnt;
if(cnt==0)
{
if(0==tag)
{
printf("%05d\n",Node[i].address);
tag=1;
}
printf("%05d %d -1\n",Node[i].address, Node[i].data);
break;
}
else
{
if(0==tag)
{
printf("%05d\n",Node[i].address);
tag=1;
}
printf("%05d %d %05d\n",Node[i].address, Node[i].data,Node[i+1].address);
}
}
}
return 0;
}