以结构体数组来模拟链表,通过赋值index然后排序来确定先后顺序,输出的时候注意链表断裂的情况如何处理
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> p;
const int maxn = 100005;
const int INF = 0x3f3f3f3f;
int i, j, n, x, cnt1 = 0, cnt2 = 0, cnt, addr, flag[maxn] = {0};
struct node
{
int value;
int adr;
int next;
int num;
bool operator < (const node &y) const
{
return num < y.num;//通过以index排序来确定链表(结构体)的先后顺序
}
}a[maxn];
int main()
{
cin>>addr>>n;
for(i = 0; i < maxn; i++)
{
a[i].num = 2 * maxn;
}
for(i = 0; i < n; i++)
{
cin>>x;
a[x].adr = x;
cin>>a[x].value>>a[x].next;
}
for(i = addr; i != -1; i = a[i].next)
{
int t = abs(a[i].value);
if(!flag[t])
{
flag[t] = 1;
a[i].num = cnt1;
cnt1++;
}
else
{
a[i].num = maxn + cnt2;
cnt2++;
}
}
sort(a, a+maxn);
int cnt = cnt1 + cnt2;
for(i = 0; i < cnt; i++)
{
if(i != cnt1-1 && i != cnt-1)
printf("%05d %d %05d\n", a[i].adr, a[i].value, a[i+1].adr);//因为中间会去掉重复的,所以next输出的是下一项的地址,避免链表断裂
else
printf("%05d %d -1\n", a[i].adr, a[i].value);.//两个链表的最后一项一定为-1
}
return 0;
}