算法学习日记——数组模拟单链表

这是一个用数组来模拟链表并进行操作的算法

然后今天我遇到了两个问题:

                          指针的变化           调试错误

1.如何理解“数组模拟出的” 指针变化

在学习头插法时老师往往会这样写:

//将x插到头节点
void add_to_head(int x)
{
	e[idx] = x;//将x存入e
	ne[idx] = head;//x的next指针指向头节点
	head = idx;//head指向新结点
	idx++;//idx右移一位以方便下一次插入
}

并给出这样的形象画法:

      如果你理解力很强在学到这个部分时应该不会有什么问题吧哈哈,但是两年半前在学校听课我(菜)没能搞懂为什么ne[idx]=head=idx,head为什么又能给指针赋值,又能等于idx这个索引(下标)????

首先第一个误区——赋值语句不是方程!所以上面的等式是无稽之谈

     我相信初学者很也有部分人像我一样深受应试教育之害,走出这个惯性思维的要点在于等号后面的变量不要看作是变量而是一个实际的数字(或者字母)

其次:在这里如果仅仅只是把idx理解为数组索引是不准确的,它还起到其他的作用,它是开出来作为一个辅助位帮助链表操作的

于是我将注释写成这样:

//存入
e[idx] = x;
ne[idx] = head;
//更新
head = idx;
idx++;

是不是逐渐理解一切。

原理解释起来就是我们所开辟的内存空间(e[idx],ne[idx])需要存入所给的值,然后把已经存在的数据和指针(idx,head)更新一下,更新为一个设定好的初始值,其实这个值可以是其他的数(使用idx是为了不再去定义更多的变量)

    你也可以理解为本来就存在一块内存存有两个已经初始化的变量(一个数据一个地址),它们的作用就是把正确的值交换进来,然后更新自己为下一个链表操作做准备。

这是头插法原理,从中间插入也差不多~

2.(并非)边界值问题

调试代码的时候出现了无限循环,导致超时

此文中 我们使ne[x]数组来存放指针,这是我写的代码调试出来的玩意儿:

这是大佬的示例代码的调试:

     发现问题》在同样的输入下我的数组存入指针是错误的

代码对比:

淦!让我好找,原来传参要传k-1而不是k,因为数组默认下标从零开始嘛。。。。。说真的有时候就是这么小的问题,但是找了很久心累啊。

  现在看看如何解释出现的循环现象,首先循环经检查是输入时出现的,控制一下变量...WO不行啊好复杂,指针存放的位置错误出现了很多不同的结果,,,,,一开始完全没有头绪(好想放弃

思考:

若k为期望位置,根据ne[idx] = ne[k];代码中被影响的其实只有指针在数组中存放的位置,那接下来只要讨论指针位置对代码的影响应该就好了,那么:

1.指针在代码中影响什么逻辑走向?

   ne[]在主函数中仅仅影响结果的输出

如果我在位置1插入数字,实际

2.指针如果覆盖了之前的指针又是什么情况?

3.指针会不会变成野指针?

写不动啦有空再更(Π~Π)

更多问题参可考大佬文章:
https://blog.csdn.net/m0_74215326/article/details/128770930

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值