之前一直觉得链表很神秘,扣扣索索写不出来,逻辑通了后,通过将单向链表中在尾部新增结点的函数完全弄懂后,单向链表也就很轻松写出来删除某个位置的结点的函数和在任意位置增加结点的函数,增删改查也就搞定了
弄懂尾部新增结点的函数后的感觉:首先很清晰链表上的环节怎么实现,其次自己考虑了一下细微的地方就出来了(例如写其他函数的时候不由自主就会想,我怎么知道用户有没有先调建结点的函数就掉删除结点的函数等)
收获:可以写出单向链表的功能,和数组一样的使用,学会用visio画流程图,尝试将伪代码复制粘贴将If改if这种小问题后就可以实现功能的滋味
单向链表的逻辑:铁链一样,一个环一个环连在一起的,如图一样,每个环称一个结点,每个结点里面内部结构如图矩形
链表和数组共同点:都是存一堆连续的数据,要求存储位置连续
链表和数组的不同:1.数组的开辟是在内存中找一块符合数组大小的空间才开辟,假如我char a[3]的数组,a[0]的地址为0x9000,那a[1]的地址肯定是0x9001……
链表是上一个结点中的指针段来存下一个结点的地址,这样的话第一个结点地址是0x9000,第二个结点的地址很小的几率是0x9001(随机分配),因为将第二个结点的地址保存在了第一个结点上,所以是不是也构成了“连续”
2.数组查找其中一个数据,假如查找a[2]的数据,我a[0+2]、a[1+1]、a[3-1]或者直接a[2]都可以找的到,查找方面很高效率,但是如果删除a[2]呢,就得将a[3]数据给a[2],a[4]数据给a[3]一次类推,在a[2]和a[1]中间新增加一个空间,a[2]数据给a[3]……在不是尾的地方加数据或者建数据会很麻烦
而链表在第二个结点位置处新增加一个结点,将原先第二个结点的地址给新结点,将结点地址给第一个结点,搞定,删除第二个结点,找到第三个结点的地址,将地址直接给予第一个结点,搞定,在任意位置增加删除数据都很有效率,但是在查找方面,链表是只知道第一个结点的地址的,第二个结点地址在第一个结点中,如果这样,我想知道第五个结点的数据,我得从第一个结点找到第二个结点,通过第二个结点找到第三个结点……很慢
这就是数组和链表的区别
接下来说实现:
建一个结点的模具,结构体,里面有数据部分、结构体类型的指针部分
struct List
{
int data;
List *p;
};
每需要一个结点就是将模具实例化一次
new List;
万事俱备了,可以开始动代码了
功能无非增删改查(改也就是)
PS:数据段、指针段、模具这几个词都是我自己想的,非官方
代码:几个链表功能的函数(从底部增加结点、删除任意位置的结点、任意位置增加结点、查询任意位置的结点、更改任意位置结点数据、链表中数据按小到大排序、main里情况、visio话的链表排序的流程图)
原文地址:http://blog.csdn.net/panpen120/article/details/39228947