嵌入式学习之C语言链表

链表是一种数据结构,与数组相比,它在内存中不连续,便于增删改查操作。链表由结构体和指针构成,每个节点包含数据域和指针域。文章介绍了链表的静态创建、获取节点数、查询、插入、删除和修改节点的方法,并讨论了动态创建链表的头插法和尾插法。
摘要由CSDN通过智能技术生成

链表就是一种数据结构,是一种数据存放的思想。数组在内存地址是连续存在的,如果要在一个数组中增加某一个元素或者删除一个元素就比较难。所以引入链表的概念!链表在内存地址中是不连续的,所以对链表进行增删改查就比较容易。

 链表是由结构体和指针配合使用构成的一种动态数据结构。链表中的每个元素称为一个节点,每个节点都可以存储在内存中的不同位置,每个节点都包括两部分:第一部分为数据域,用于存储元素本身的数据信息;第二部分为指针域,其是结构体指针,用于存储其直接后继的节点信息。下面就通过一个例子来初步了解链表。

链表的静态创建

 

 

链表的获取总节点数

 

在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指向新创建的节点 。

 以上就是链表的基本知识了!如果文章有不对的地方麻烦各位伙伴斧正交流。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值