链表指针新理解以及插入里链表节点新方法

自立志开始学习编程开始已经有一周左右,作为一个freshman和greenhead,不得不说对指针的理解还不是很好,特别在学习链表时对链表指针的思考也让我相当有收获。在我看来,数据结构教科书上对链表的描述总是把指针作为前一节点的成员,但有时从原理上来理解反而有些困难。后来发现另一种理解也能适用于各种情形。大致如下:
认为p指针既为p节点,p->val为p节点的值,而淡化p指针为前一节点的成员这个事实。
这样就可以将教科书上的图转化为另一个图,如下:

经过几天学习,发现p并非前一节点的next,而是保存着前一节点next中所存地址的指针变量,因此就非常容易理解,故上述内容有误,也希望大家能从中得到经验和教训


另外,最近学习链表时发现,如希望插入一个节点,方法一般是找到该节点的前一节点,再进行插入:
LNode * q = (LNode *)malloc(sizeof(LNode));
q->val = e;
q->next = p->next; //p为插入位置的前一节点
p->next = q;
这种方法是一种普适的方法。但如果只能提供插入位置的后一节点,应该怎么办?其实很简单。实际上我们本质上做的仍然是在指定位置后面插入节点,只是在赋值时做一点小变化就可以完成在指定节点前插入新节点的任务。
LNode * q = (LNode *)malloc(sizeof(LNode));
q->next = p->next; 
p->next = q;
q->val = p->val;//此处将p的值赋给q,新的q节点就相当于是之前的p节点。
p->val = e;//此时赋值给p节点值,使其称为新节点。

最后是关于new、malloc、free和calloc。学习时发现malloc和free一般应该成对出现,这样才能完成对内存池的管理,不发生内存泄漏。同时应注意,free函数可能只是使指针所指地址的内存被释放,而指针此时可能指向任意位置,这就造成了野指针,这是极具危险性的。
new和malloc差不多,但malloc产生的指针是void*,必须强制指派类型才能使用;new的优点在于形式简单,且不需要强制指派类型。
calloc和malloc的区别在于,calloc会初始化为0或空,但malloc开辟空间后可能是任意值,需要程序员自己完成初始化。
希望与大家共勉,如果有不清楚的地方也可回复本文,欢迎讨论和大牛的指导。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值