00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
分为两块 链表处理 和 结果处理
链表处理通过order顺序链接起来 通过对order排序还可以一并处理掉无效节点
结果处理好麻烦
主要是处理next
先考虑是不是最后一块
不是 就要考虑不是最后一个节点 和是最后一个节点
是 就要考虑是不是完整的最后一块
是的话直接输出 -1
不是的话就要顺序输出
#include <cstdio>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 100010;
struct Node
{
int address;
int data;
int next;
int order;
}node[maxn];
bool cmp(Node a,Node b)
{
return a.order < b.order;
}
int main()
{
for(int i = 0; i < maxn; i++)
{
node[i].order = maxn;
}
int begin,n,k;
int address,data,next;
cin >> begin >> n >> k;
for(int i = 0; i < n; i++)
{
cin >> address >> data >> next;
node[address].address = address;
node[address].data = data;
node[address].next = next;
}
int p = begin, count = 0;
while(p != -1)
{
node[p].order = count++;
p = node[p].next;
}
sort(node,node + maxn,cmp);
n = count; //有效节点count个
for(int i = 0; i < n / k; i++) //先处理整块的
{
//第i块倒着输出
for(int j = (i + 1) * k - 1;j > i * k; j--)
{
printf("%05d %d %05d\n", node[j].address,node[j].data,node[j-1].address);
}
printf("%05d %d ",node[i * k].address,node[i*k].data);
//若果不是最后一块那就指向下一块的最后一个节点
if(i < n / k - 1) printf("%05d\n",node[(i+2)*k -1].address);
else //是最后一块 还要考虑是不是完整的
{
if(n %k == 0) printf("-1\n");
else
{
printf("%05d\n",node[(i+1)*k].address);
for(int i = n / k * k; i < n; i++)
{
printf("%05d %d ",node[i].address,node[i].data);
if(i < n-1)
{
printf("%05d\n",node[i+1].address);
}
else
{
printf("-1\n");
}
}
}
}
}
return 0;
}