当初刚开始学单链表学的是一头雾水,简直就是彻头彻尾灾难,一塌糊涂,过段时间后经过自己的重新认真思考再结合小练习明白了它是怎么个回事儿。
1、首先从它的逻辑上入手,对他有大体认知。
简单来说就是一个一个有方向小块儿连在一起,好像疫情期间大家排队做核酸,都朝着医护人员那个方向,医护人员会从第一个开始数有多少人。先看看怎么用图片表示单链表。
这是一些有方向的小块儿,他们叫结点,它包含两个部分,数据域和后继节点位置的指针。
把他们连起来就比较好理解上面的话了,数据与很好理解,就是我这个节点存储的信息,就像是下面图片里各个节点存储的信息是A,B,C,D,E。后继节点位置的指针就是Next。例如,A的Next指向的是包含数据B的结点。E的指针域为什么是NULL,因为他后面没有节点了,指针无法寻找下一个结点。
在实际应用中,我们还会加一个头结点的东西,如下图。
头结点可是个好东西,他能够方便我们去管理链表,空表和非空表都能统一处理。
例如有两个单链表,都没有头结点。非空表和空表,空表就是没有任何的东西,当我去看这个空表的时候必然是NULL,非空表就不一样了,进来就会看到至少有一个结点,是有东西的。
再例如还是有两个单链表,都有头结点,那么进来都会先看见至少有一个结点必然不是NULL,然后在处理第一个元素时,两个表可以根据头结点的next去处理,与别的元素一样都是上一个的next,不必特殊处理。
2、下面我们先创建一个结点。
根据图片我们知道有哪些因素:
由图可知,一个节点是数据域和下个节点的指针组成,它们是一个整体,所以我们用结构体表示:
typedef struct LinkNode { char letter;//这里的元素简单用一个字符表示,当然也可以用别的数据类型,可以用多个元素 struct LinkNode* next;//下一个结点的指针 }LNode,*LinkList;
我们有了结点的定义,下面该把这个结点初始化了,它肯定就是这个链表头结点了。
LinkList Init_linklist() { LinkList temp = (LinkList)malloc(sizeof(LNode)); //申请一段内存,大小为这个结点所占大小 temp->letter = 0; //初始化数据 temp->next = NULL; //初始化数据,下一个节点为空 return temp; } //创建新链表 LinkList head = Init_linklist();//head作为头结点
总结:①单链表是单向的,结点只能由前一个寻找后一个。
②做个类比,LNode相当于char,LinkList相当于char*,方便理解。
下一篇将会说明如何管理单链表,无非就是增、删、改、查。先说明如何添加新元素,也就是增。
以上只是本人的理解和所见,如有不同见解和看法,欢迎在评论区批评指正。
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!