输入样例:
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
思路:将地址作为结构体下标,在结构体中存放键值与下一个节点的地址,然后从首地址遍历直到等于-1,将需要输出的节点地址放在pre数组中,需要删去的节点的地址放在del数组中,最后按着pre与del数组中的地址输出就可以了。
注意:最后一个节点的地址都是-1;每一个节点的nxt是下一个节点的地址。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct node {
int val,nxt;
}sqlist[N];
int main() {
int str,n;
cin>>str>>n;
for(int i=1; i<=n; i++) {
int ads,val,nxt;
cin>>ads>>val>>nxt;
sqlist[ads].val = val;
sqlist[ads].nxt = nxt;
}
int vis[N];
memset(vis,0,sizeof(vis));
int pre[N],del[N],cnt1=0,cnt2=0;
for(int i=str; i!=-1; i=sqlist[i].nxt) {
int now = abs(sqlist[i].val);
if(vis[now]==0) {
pre[++cnt1] = i;
vis[now] = 1;
}
else {
del[++cnt2] = i;
}
}
for(int i=1; i<=cnt1; i++) {
if(i!=cnt1) printf("%05d %d %05d\n",pre[i],sqlist[pre[i]].val,pre[i+1]);
else printf("%05d %d -1\n",pre[i],sqlist[pre[i]].val);
}
for(int i=1; i<=cnt2; i++) {
if(i!=cnt2) printf("%05d %d %05d\n",del[i],sqlist[del[i]].val,del[i+1]);
else printf("%05d %d -1\n",del[i],sqlist[del[i]].val);
}
return 0;
}