链表就是一种数据结构,是一种数据存放的思想。数组在内存地址是连续存在的,如果要在一个数组中增加某一个元素或者删除一个元素就比较难。所以引入链表的概念!链表在内存地址中是不连续的,所以对链表进行增删改查就比较容易。
链表是由结构体和指针配合使用构成的一种动态数据结构。链表中的每个元素称为一个节点,每个节点都可以存储在内存中的不同位置,每个节点都包括两部分:第一部分为数据域,用于存储元素本身的数据信息;第二部分为指针域,其是结构体指针,用于存储其直接后继的节点信息。下面就通过一个例子来初步了解链表。
链表的静态创建
链表的获取总节点数
在main函数中定义一个整型变量ret来接收 relink函数返回来的cnt,然后再通过打印获取总的链表个数
查询节点
在main函数里面定义一个整型变量ret来接收searchlink()函数的返回值,如果返回1就是找到,如果返回0就是没找到
从某个节点后面插入一个新节点
核心代码: new->next = p->next; // 假设插在3节点后面,让新节点的下一个指向第四个节点
p->next = new; // 3节点指向新节点
从某个节点前面插入一个新节点
从前面插入的话就要再考虑一种情况,判断插入的位置是否是头节点,所以分两种情况
这个分为两种情况:1. 从头节点前面插入
核心代码 : new->next = head
return new
2. 从非头节点前面插入
核心代码: new->next = p->next;
p->next = new;
整体结合代码如下
删除节点
删除节点也跟上面插入某个节点一样的逻辑,分为两种情况
1.删除头节点:就是改头,把头结点指向下一个节点,然后返回头结点
核心代码如下:
2.删除除了头结点以为的任何一个节点,例如第二个节点
核心代码:
p->next = p->next->next; //让头节点指向第三个节点
return head;
整体代码如下:
改节点
改节点的逻辑跟找节点的逻辑一样,就是先找,然后找到后改就行了
动态创建链表,头插法
这段代码实现了从头节点开始插入新节点,所以这样出来的链表中节点的顺序要注意一下:第一个插入的节点是尾节点。 我们分析这段代码可以看到只有我们不输入0就可以不断创建新节点,而且把每个新malloc出来的新节点的next指向上一个malloc出来的节点,这里要注意每次malloc一个新节点一定要把其next指向NULL,因为我之前是在虚拟机里写得代码,会默认malloc后节点的next会指向NULL,这也导致我把代码拷贝到windows中的编译器中运行会出现错误。
头插法优化
优化链表就是把上段代码给拆分了,在函数creatLink中调用函数insertFromHead,当然这一定程度上是为了代码的实用性。
动态创建链表,尾插法
和头插法不一样的是尾插法要先遍历到最后一个节点,再用最后一个节点的next指向新创建的节点 。
以上就是链表的基本知识了!如果文章有不对的地方麻烦各位伙伴斧正交流。