输入样例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
输出样例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1000000+5;
int wh1[N],wh2[N],dat[N],nex[N],vis[N];
void print(int place,int data,int nexplace)
{
if(!place)
printf("00000 ");
else
printf("%05d ",place);
printf("%d ",data);
if(!nexplace)
printf("00000\n");
else if(nexplace==-1)
printf("-1\n");
else
printf("%05d\n",nexplace);
}
int main()
{
int fir,n;
scanf("%d%d",&fir,&n);
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
dat[x]=y,nex[x]=z;//地址x的数据值,地址x的下一个地址
}
int dex=fir,cnt1=0,cnt2=0;
while(dex!=-1)//wh[i]链表的第i个节点的地址 初始链表有序化并造出新顺序的链表
{
if(!vis[abs(dat[dex])])
{
vis[abs(dat[dex])]=1;
wh1[++cnt1]=dex;//旧链表
}
else
wh2[++cnt2]=dex;//新链表
dex=nex[dex];
}
dex=fir;
for(int i=1;i<cnt1;i++)
print(wh1[i],dat[wh1[i]],wh1[i+1]);
if(cnt1>0)
print(wh1[cnt1],dat[wh1[cnt1]],-1);
for(int i=1;i<cnt2;i++)
print(wh2[i],dat[wh2[i]],wh2[i+1]);
if(cnt2>0)
print(wh2[cnt2],dat[wh2[cnt2]],-1);
}