PTA-L2-022 リンクリストの並び替え (25点)
この質問は、リンクされたリストに関するものです。
配列を直接扱うことができます。
ここで言いたいのは、アウトプットの状況です。
保存するとき、リンクされたリストの順序で各ノードに対応するインデックスを与えます。
次に、このインデックスに従って並べ替えます。
出力時は奇数と偶数の出力に注意してください。
また、リテイク後のアドレスである、出力ノードの次のノード フィールドを変更する必要があることにも注意してください。
「-1」の場合には特に注意してください。
コード部分:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e5 + 10;
const int M = 55;
const int INF = 1e6 + 10;
const double eps = 0.05;
typedef long long ll;
struct node
{
int adr;
int data;
int nex;
int index;
}a[N];
int n, ad;
bool cmp(node x, node y)
{
return x.index < y.index;
}
int main()
{
for (int i = 0; i < N; i++)
{
a[i].index = INF;
}
cin >> ad >> n;
for (int i = 0; i < n; i++)
{
int t;
scanf ("%d", &t);
a[t].adr = t;
scanf ("%d%d", &a[t].data, &a[t].nex);
}
int star = ad;
int cnt = 1;
while (star != -1)
{
a[star].index = cnt;
cnt++;
star = a[star].nex;
}
sort(a, a + N, cmp);
int i = 0, j = n - 1;
cnt--;
for (int i = 0; i < cnt / 2; i++)
{
printf ("%05d %d %05d\n", a[cnt - i - 1].adr, a[cnt - i - 1].data, a[i].adr);
if (!(cnt & 1) && (i == cnt / 2 - 1))
{
printf ("%05d %d -1\n", a[i].adr, a[i].data);
}
else
{
printf ("%05d %d %05d\n", a[i].adr, a[i].data, a[cnt - i - 2].adr);
}
}
if (cnt & 1)
{
printf ("%05d %d -1\n", a[cnt / 2].adr, a[cnt / 2].data);
}
return 0;
}