02-线性结构3 Reversing Linked List (25 分)(把变量放入数组下标和数组值里面,方便处理)

跪求这题链表的解法,感觉处理起来没有顺序表方便,于是偷懒用了一波结构体数组的解法,其中也涉及了很多的知识点
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;
}

未完待续,等有时间去思考一下链表的解法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值