思路:
使用静态链表,多一个order的属性,来记录他应该所在的位置。然后按照order来排序。
但是:还有一个样例没有通过!!!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node
{
int address,data,next;
int order;
}Node[maxn];
bool cmp(node a,node b){
return a.order<b.order;
}
int main()
{
bool isexit[1000010]={false};//哈希表
memset(isexit,0,sizeof(isexit));
int begin,n;
scanf("%d %d",&begin,&n);
int address;
for(int i=0;i<n;i++){
scanf("%d",&address);
scanf("%d%d",&Node[address].data,&Node[address].next);
Node[address].address=address;
}
for(int i=0;i<maxn;i++)
{
Node[i].order=maxn*2;//让每一个都是无效节点
}
int p=begin;
int count1=0;//有效的
int count2=0; //无效的
while(p!=-1)
{
if(isexit[abs(Node[p].data)]==false){
isexit[abs(Node[p].data)]=true;
Node[p].order=count1++;
p=Node[p].next;
}else{
Node[p].order=maxn+count2++;
p=Node[p].next;
}
}
sort(Node,Node+maxn,cmp);
int count=count1+count2;
int i;
for( i=0;i<count1-1;i++){
printf("%05d %d %05d\n",Node[i].address,Node[i].data,Node[i+1].address);
}
printf("%05d %d -1\n",Node[i].address,Node[i].data);
for( i=i+1;i<count1+count2-1;i++){
printf("%05d %d %05d\n",Node[i].address,Node[i].data,Node[i+1].address);
}
printf("%05d %d -1\n",Node[i].address,Node[i].data);
}