①先判断是否会交换结点位置,如本题需要交换,则结构体中设置address来记录本节点地址
②algorithm下的函数要善于应用,不过本题可以直接倒序列输出。
③输入地址用int型,输入后不是五位数,也就是没有前导0不会影响数据的存储,只需要输出时在int地址前加入前导0即可。
④判断在给出起始地址链上的结点信息,以下模板
for(int q=fa;q!=-1;q=p[q].next)
{
p1[num].address=q;
p1[num].data=p[q].data;
p1[num].next=p[q].next;
count++;
num++;
}
可以把他们另存一个数组,也可以设置标志位,在链上将flag设置为1,注意结束条件不是q.next!=-1.
#include<bits/stdc++.h>
using namespace std;
struct node{
int address,data,next=-1;
}p[100010],p1[100010];
int main(){
int fa,n,k,temp,num=0,count=0;
cin>>fa>>n>>k;
for(int i=0;i<n;i++)
{
cin>>temp;
p[temp].address=temp;
cin>>p[temp].data>>p[temp].next;
}
for(int q=fa;q!=-1;q=p[q].next)
{
p1[num].address=q;
p1[num].data=p[q].data;
p1[num].next=p[q].next;
count++;
num++;
}
int b=count/k;
for(int i=0;i<b;i++)
reverse(p1+i*k,p1+i*k+k);
for(int i=0;i<count;i++)
{
if(i!=count-1)
printf("%05d %d %05d\n",p1[i].address,p1[i].data,p1[i+1].address);
else
printf("%05d %d -1\n",p1[i].address,p1[i].data);
}
return 0;
}
看看柳落的
#include <iostream>
using namespace std;
int main() {
int first, k, n, sum = 0;
cin >> first >> n >> k;
int temp, data[100005], next[100005], list[100005], result[100005];
for (int i = 0; i < n; i++) {
cin >> temp;
cin >> data[temp] >> next[temp];
}
while (first != -1) {
list[sum++] = first;
first = next[first];
}
for (int i = 0; i < sum; i++) result[i] = list[i];
for (int i = 0; i < (sum - sum % k); i++)
result[i] = list[i / k * k + k - 1 - i % k];
for (int i = 0; i < sum - 1; i++)
printf("%05d %d %05d\n", result[i], data[result[i]], result[i + 1]);
printf("%05d %d -1", result[sum - 1], data[result[sum - 1]]);
return 0;
算了,还是按自己的模板来