跪求这题链表的解法,感觉处理起来没有顺序表方便,于是偷懒用了一波结构体数组的解法,其中也涉及了很多的知识点
1.这题还是使用了之前的一个技巧,因为输入的每一组数据包括该节点的地址,data值以及下一组数据节点的地址,变量有三个(其实是两个,有一个是下一个节点的地址值)。所以定义了一个结构体数组,数组下标值为对应节点的地址值,结构体内部的data和next分别代表该节点的data和下一个结点的address,以此来实现延续性。
2.为了简便运算,这题使用了reserve函数
3.同样为了简便运算,使用了c语言输出五位数的方式,c++的setw()和setfill比较麻烦(个人感觉)
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxsize = 1000010;//这个数据很重要,少一位会数据太小不够处理
struct node { //多一位会堆溢出,出现异常,都导致无法正常调试
int data; //当然如果使用maxsize的数组都定义为全局则不受堆溢出影响
int next;
}a[Maxsize];//为什么这个结构体数组在主函数中定义会抛出异常?
int b[Maxsize];//这里定义不会受到main函数空间影响进而导致堆溢出之类的麻烦
//这题也用了把地址变量当作数组下标,以此来方便处理多变量的问题
int main()
{
//node a[Maxsize];因为这个数组太大了,定义在这里会发生溢出
//int b[Maxsize];这个也最好不要在主函数当中定义,也很大
int first, N, K;
cin >> first >> N >> K;
for (int i = 0;i < N;i++)
{
int x, y, z;
cin >> x >> y >> z;
a[x].data = y;//这个算法把每个输入的地址当做数组下标,把Data当作数组中data的值
a[x].next = z;//把对应的下一个数据的地址当作该数组中next的值
}
int p1 = first;//从给的第一个地址开始找起
int i = 0;
while (p1 != -1)//只要地址不为0,则可以找到下一个数据,然后把下一个数据的地址放在b[i++]里面
{
b[i++] = p1;//这样,就可以把给出的结点排好序
p1 = a[p1].next;//这是找p对应的下一个地址,a[p1].next表示的是对应的下一个数据节点的地址
}
//这样,就把数据节点全部有序的放在了b数组里面
int j = 0;
while (j <= i-K)
{
reverse(&b[j], &b[j + K]);//然后利用reverse函数,把位置反转,然后输出自己的地址
j = j + K; //和反转后下一个数据的地址就可以了
}
//总体思路是把自己的地址和数据当成一个结点,输出之后再输出i+1结点的地址就可以了
int s = 0;
for (s = 0;s < i - 1;++s)
printf("%05d %d %05d\n", b[s], a[b[s]].data, b[s + 1]);
printf("%05d %d -1\n", b[s], a[b[s]].data);
//这里输出五位整数,也可以使用c++中的setw和setfill函数,但是本人觉得比较麻烦
//于是借鉴了网上c语言的解法
return 0;
}
未完待续,等有时间去思考一下链表的解法。