首先是单链表,先写一个定义单链表
经过定义数据类型,以后只需要改变int就行

接下来是单链表的打印,这时候思考,空链表能不能打印呢?应该是可以滴,所以这个assert断言是不是有点画蛇添足了,对的,应该删去!

接下来是单链表的尾插,这里有一个很重要的知识点,传二级指针!
这时,你想要尾插一个结构体形,这时候传参, 应该传什么呢?直接&结构体?这时候你虽然能改结构体中的数据,是传址调用,但是!形参是实参的拷贝!这个结构体要是非常大呢?!这时候直接&结构体,是不是就不太合适呢?所以你选择传指针,那参数写什么呢?直接传结构体的一级指针吗?那不纯纯是传值调用嘛,你搁那个函数里改的再嗨,外面儿的实参也不会发生一丁点的改变,所以呢,你选择传&一级结构体指针,所以形参就是二级指针啦!懂了嘛!
*pplist就是你的实际结构体!用他改,没问题!
二级指针是需要断言滴,万一使用的人,传的是空指针嘞,所以assert(pplist)十分重要!

接下来就是单链表头插,重点就是最后别忘记把新头赋给*pplist啦
单链表的尾删,也要考虑pplist,还有就是,空链表不能删!!!如果他只有一个元素数据,那就直接free*pplist,然后链表置空就好啦
单链表的头删也是类似嗷~

单链表的查找,相当简单了昂,只不过要注意,先判断,这个链表是不是空,如果不判断的话,直接进while循环,如果是空链表,会越界访问的
单链表,在pos位置之后插入
看,是不是就比动态顺序表简单太多啦,不用大量移动数据,但是,思考一下,如果在pos位置之前插入数据呢?
单链表删除pos位置后的数据,这时候要注意!如果pos后是空,那就不需要删啦,直接返回就可以了。

接下来思考思考,如果是在pos位置前插入呢?如果在pos位置前删除呢?这时候就又得遍历一遍链表,如果这个链表特别长呢?那不太费时了嘛,如果可以直接访问少一个数据,那就好了,所以,双链表就来啦
单链表在pos位置前插入数据,这时你看,十分麻烦,先考虑pos是不是头,要不要来一个头插,然后再考虑pos在不在*pphead这个链表里面儿,并且还要遍历链表找到pos前的那个元素数据,十分麻烦
所以,还得学习一下双链表~
最后再附一张指针关系图,一级指针保存结构体地址,二级指针保存一级指针地址,无线套娃~
所以,*psl=结构体sl
*ppsl=psl
1336

被折叠的 条评论
为什么被折叠?



