坑点说明:
1.设置数组下标过小不会显示溢出只是答案错误
2.有效结点数可能不为N需过滤一遍得到有效结点(存在游离结点)
考察知识点归纳:
1.数组的反转
2.数组以下标作地址仿链表储存
3.控制格式输出
#include<stdio.h>
int main(void){
int i,t,m,tou,N,K,wxx[100000],wxx2[100000],wxx3[100000];//wxx储存结点值,wxx2储存下一结点地址,wxx3储存有效结点
scanf("%d %d %d",&tou,&N,&K);//根据题目要求设置数组大小(地址最大为99999)
for(i=0;i<N;i++){
scanf("%d",&t);//用数组下标代表结点地址进行储存
scanf("%d %d",&wxx[t],&wxx2[t]);
}
N=0;
while(tou!=-1){//N个结点中可能有游离结点(无效结点),故需要从头结点遍历一遍储存在wxx3中(此时结点相邻储存便于反转)
wxx3[N++]=tou;
tou=wxx2[tou];//获取下一结点下标地址
}
for(i=0;i<N/K;i++){//反转次数
for(t=0;t<K/2;t++){//进行反转
m=wxx3[t+i*K];
wxx3[t+i*K]=wxx3[i*K+K-1-t];
wxx3[i*K+K-1-t]=m;
}
}
for(i=0;i<N-1;i++)//按题目要求输出(%05d输出5位不足补0非常方便)
printf("%05d %d %05d\n",wxx3[i],wxx[wxx3[i]],wxx3[i+1]);
printf("%05d %d -1",wxx3[N-1],wxx[wxx3[N-1]]);//注意最后结点的后为-1不能输出5位需要特例输出
}