分类分析即可。仔细分析不难得出结论。
自己写的ac的代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1000010;
struct Node
{
int address,next,data;
int flag;//是否有效
}node[maxn];
bool cmp(Node a,Node b)
{
return a.flag<b.flag;
}
int main()
{
int begin,n,k;
scanf("%d %d %d",&begin,&n,&k);
int address;
for (int i=0;i<maxn;i++)
{
node[i].flag=maxn;
}
for(int i=0;i<n;i++)
{
scanf("%d",&address);
scanf("%d %d",&node[address].data,&node[address].next);
node[address].address=address;
node[address].flag=address;
}
int p=begin;
int count=0;
while(p!=-1)
{
node[p].flag=count++;
p=node[p].next;
}
sort(node,node+maxn,cmp);//排序之后数组就发生了变化!!!
for(int i=0;i<count/k;i++)
{
int j=0;
for(j=(i+1)*k-1;j>i*k;j--)
{
printf("%05d %d %05d\n",node[j].address,node[j].data,node[j-1].address);
}
if(j==i*k)//j指到块块的边上
{
if(((count/k)*k-k)!=(i*k))//i没有指到最后一组
printf("%05d %d %05d\n",node[j].address,node[j].data,
node[(i+2)*k-1].address);
else//i指到了最后一组
{
//printf("==");printf("==%d",node[5].next);
if(node[j+k-1].next==-1){//如果后面没有了
printf("%05d %d -1\n",node[j].address,node[j].data);
//printf("==%d",node[4].next);
}
else{//如果后面还有
printf("%05d %d %05d\n",node[j].address,node[j].data,
node[(i+1)*k].address);
int p=(i+1)*k;
while(node[p].next!=-1){
/* if(node[p].next==-1){//错误的地方!修正!
printf("%05d %d -1\n",node[p].address,node[p].data
);
}*/
printf("%05d %d %05d\n",node[p].address,node[p].data,
node[p+1].address);
p++;
}if(node[p].next==-1){
printf("%05d %d -1\n",node[p].address,node[p].data);
}
}
}
}
}
}