0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言实现单链表-增删改查

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-05-25 15:05 次阅读

链表是由一连串节点组成的数据结构,每个节点包含一个数据值和一个指向下一个节点的指针。链表可以在头部和尾部插入和删除节点,因此可以在任何地方插入和删除节点,从而使其变得灵活和易于实现。

链表通常用于实现有序集合,例如队列和双向链表。链表的优点是可以快速随机访问节点,而缺点是插入和删除操作相对慢一些,因为需要移动节点。此外,链表的长度通常受限于内存空间,因此当链表变得很长时,可能需要通过分页或链表分段等方式来管理其内存。

image-20230525150013245

下面是一套封装好的单链表框架,包括创建链表、插入节点、删除节点、修改节点、遍历节点和清空链表等常见操作,其中每个节点存储一个结构体变量,该结构体中包含一个名为data的int类型成员。

#include 
 #include // 链表节点结构体
 typedef struct ListNode {
     int data;                   // 节点数据
     struct ListNode *next;      // 下一个节点的指针
 } ListNode;
 ​
 // 创建一个新节点
 ListNode *createNode(int data) {
     ListNode *node = (ListNode*) malloc(sizeof(ListNode));
     node->data = data;
     node->next = NULL;
     return node;
 }
 ​
 // 在链表头部插入一个新节点
 ListNode *insertNodeAtHead(ListNode *head, int data) {
     ListNode *node = createNode(data);
     node->next = head;
     return node;
 }
 ​
 // 在链表尾部插入一个新节点
 ListNode *insertNodeAtTail(ListNode *head, int data) {
     ListNode *node = createNode(data);
     if(head == NULL) {
         return node;
     } else {
         ListNode *current = head;
         while(current->next != NULL) {
             current = current->next;
         }
         current->next = node;
         return head;
     }
 }
 ​
 // 删除链表中第一个值为data的节点
 ListNode *deleteNode(ListNode *head, int data) {
     if(head == NULL) {
         return NULL;
     }
     if(head->data == data) {
         ListNode *current = head;
         head = head->next;
         free(current);
         return head;
     }
     ListNode *current = head;
     while(current->next != NULL && current->next->data != data) {
         current = current->next;
     }
     if(current->next != NULL) {
         ListNode *deleteNode = current->next;
         current->next = deleteNode->next;
         free(deleteNode);
     }
     return head;
 }
 ​
 // 修改链表中第一个值为oldData的节点的数据为newData
 void updateNode(ListNode *head, int oldData, int newData) {
     ListNode *current = head;
     while(current != NULL) {
         if(current->data == oldData) {
             current->data = newData;
             break;
         } else {
             current = current->next;
         }
     }
 }
 ​
 // 遍历链表
 void traverseList(ListNode *head) {
     ListNode *current = head;
     while(current != NULL) {
         printf("%d ", current->data);
         current = current->next;
     }
     printf("
");
 }
 ​
 // 清空链表,释放所有节点的内存空间
 void clearList(ListNode *head) {
     while(head != NULL) {
         ListNode *current = head;
         head = head->next;
         free(current);
     }
 }
 ​
 // 示例程序
 int main() {
     ListNode *head = NULL;
     head = insertNodeAtHead(head, 1);
     head = insertNodeAtHead(head, 2);
     head = insertNodeAtTail(head, 3);
     traverseList(head);
     head = deleteNode(head, 2);
     traverseList(head);
     updateNode(head, 1, 4);
     traverseList(head);
     clearList(head);
     return 0;
 }

在上述代码中,定义了一个节点结构体ListNode,其中包含一个int类型的data成员和一个指向下一个节点的指针。接着定义了用于创建新节点、插入节点、删除节点、修改节点、遍历节点和清空链表等操作的子函数,并在main函数中演示了这些操作的使用例子。在使用完链表后一定要调用clearList函数释放内存空间。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72798
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    129073
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61357
  • 指针
    +关注

    关注

    1

    文章

    473

    浏览量

    70364
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39909
收藏 人收藏

    评论

    相关推荐

    最全PID控制算法的C语言实现(转)

    最近项目中用到PID控制算法,了很多资料,资料上说的一塌糊涂,什么手动调节啊?说的和没说一样,对于刚接触PID的人根本弄不明白。当我看到《最全PID控制算法的C语言实现》的时候,只看了前面一部分就搞明白了,里面还有
    发表于 06-01 10:53

    使用DOM对XML读取进行增删改

    DOM解析XML的增删改实现
    发表于 06-12 16:01

    基于SpringBoot mybatis方式的增删改实现

    SpringBoot mybatis方式实现增删改
    发表于 06-18 16:56

    如何在本地电脑中输入access数据库路径,对它进行增删改

    各位大佬好,麻烦指导下如何在本地电脑中通过输入access数据库路径,对它进行增删改
    发表于 01-03 09:49

    使用jpa和thymeleaf做增删改示例

    【本人秃顶程序员】springboot专辑:springboot+jpa+thymeleaf增删改示例
    发表于 04-01 11:49

    如何用php调用mysql数据库实现增删改

    php调用mysql数据库实现增删改
    发表于 04-09 12:53

    laravel框架如何进行简单的增删改和文件上传

    laravel框架简单的增删改和文件上传
    发表于 04-26 14:13

    基于Proteus和C语言实现

    基于Proteus和C语言实现一共四个题目,有没有人愿意尝试一下?
    发表于 07-14 06:20

    如何使用C语言实现模糊PID控制?

    如何使用C语言实现模糊PID控制?
    发表于 09-24 08:54

    怎么实现c语言循环链表

    怎么实现c语言循环链表
    发表于 10-19 06:07

    python是如何实现hbase增删改

    hbase shell是怎样去创建命名空间的?python是如何实现hbase增删改的?求解
    发表于 10-19 07:26

    C语言实现链表举例

    所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单
    发表于 07-11 16:40 87次下载
    C<b class='flag-5'>语言实现</b>单<b class='flag-5'>链表</b>举例

    Spring+Vue增删改查实例

    Spring+Vue增删改查实例
    的头像 发表于 01-13 09:16 784次阅读
    Spring+Vue<b class='flag-5'>增删改</b>查实例

    mysql数据库的增删改查sql语句

    MySQL是一种常用的关系型数据库管理系统,是许多网站和应用程序的首选数据库。在MySQL中,我们可以使用SQL(结构化查询语言)进行数据的增删改查操作。本文将详细介绍MySQL数据库的增删改
    的头像 发表于 11-16 15:41 605次阅读

    数据库mysql基本增删改

    MySQL是一种开源的关系型数据库管理系统,常用于Web应用程序的数据存储和管理。通过使用MySQL,用户可以进行数据的增删改查操作,从而实现对数据的有效管理。下面将详细介绍MySQL数据库
    的头像 发表于 11-16 16:35 990次阅读