33,311
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
using namespace std;
struct Node{
int ad;
int data;
int next;
}node[100001],temp[100001];
int main()
{
int fstad,n,k;
while(scanf("%d %d %d",&fstad,&n,&k)!=EOF){ //输入起始地址,节点数与交换长度
for(int i=0;i<n;i++){
scanf("%d %d %d",&node[i].ad,&node[i].data,&node[i].next); //输入节点的地址,节点数值与指向下一节点的地址
}
int j=0; //统计有效节点数
for(int i=0;i<n;i++){ //依次找出每个节点并放在temp[]数组中
if(fstad==node[i].ad){
temp[j++]=node[i];
fstad=node[i].next;
i=-1;
}
if(fstad==-1) break;
}
int cont=0;
int t=0;
for(int i=k-1;i>=0&&cont<j/k;i--){ //对每隔K区间的节点转置后放入到node[]中
node[t++]=temp[i];
if(i==cont*k){
cont++;
i=cont*k+k;
}
}
if(j%k!=0){ //后面不够K的部分直接存入对应的node[]中
for(int i=j-j%k;i<n;i++){
node[i]=temp[i];
}
}
for(int i=0;i<j-1;i++){ //将后一节点的node[i].ad放入到前一节点的next中
node[i].next=node[i+1].ad;
}
for(int i=0;i<j;i++){ //依次打印
if(node[i].next==-1) printf("%05d %d %d\n",node[i].ad,node[i].data,node[i].next);
else printf("%05d %d %05d\n",node[i].ad,node[i].data,node[i].next);
}
}
return 0;
}