c语言链表的基本操作

在C语言中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的基本操作包括创建、插入、删除和遍历等。

下面是一个简单的链表节点结构体定义:

  1. struct Node {
  2.     int data;
  3.     struct Node* next;
  4. };

其中,data表示节点中的数据元素,next是指向下一个节点的指针。

  1. 创建链表:

链表的创建通常是通过定义一个指向链表头节点的指针,然后逐个添加节点来实现的。例如:

  1. struct Node* head = NULL; // 定义指向链表头节点的指针,初始化为空
  2. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
  3. new_node->data = 1; // 设置节点中的数据元素
  4. new_node->next = NULL; // 设置节点的指针为空
  5. head = new_node; // 将头指针指向新节点
  1. 插入节点:

链表的插入操作通常是在链表的末尾或指定位置插入新节点。在链表末尾插入节点的操作比较简单,只需要将新节点的指针指向原链表的最后一个节点的指针即可。例如:

  1. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
  2. new_node->data = 2; // 设置节点中的数据元素
  3. new_node->next = NULL; // 设置节点的指针为空
  4. if (head == NULL) { // 如果链表为空,将新节点设置为头节点
  5.     head = new_node;
  6. } else { // 否则,将新节点插入到链表末尾
  7.     struct Node* last = head;
  8.     while (last->next != NULL) { // 遍历找到链表的最后一个节点
  9.         last = last->next;
  10.     }
  11.     last->next = new_node; // 将最后一个节点的指针指向新节点
  12. }

要在指定位置插入节点,需要先找到插入位置的前一个节点,然后将前一个节点的指针指向新节点,新节点的指针指向下一个节点。例如:

  1. struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); // 创建新节点
  2. new_node->data = 3; // 设置节点中的数据元素
  3. new_node->next = NULL; // 设置节点的指针为空
  4. struct Node* prev = head; // 定义指向插入位置前一个节点的指针
  5. struct Node* curr = head->next; // 定义指向插入位置的指针,初始化为头节点的下一个节点
  6. while (curr != NULL && curr->data < 20) { // 遍历找到插入位置的前一个节点和插入位置的节点
  7.     prev = curr;
  8.     curr = curr->next;
  9. }
  10. prev->next = new_node; // 将前一个节点的指针指向新节点
  11. new_node->next = curr; // 将新节点的指针指向插入位置的节点(如果存在)
  1. 删除节点:

删除节点需要找到需要删除的节点,然后将前一个节点的指针指向下一个节点。例如:

  1. struct Node* delete_node = head; // 定义指向要删除节点的指针,初始化为头节点
  2. struct Node* prev = NULL; // 定义指向要删除节点前一个节点的指针
  3. struct Node* curr = head; // 定义指向要删除节点后一个节点的指针
  4. while (curr != NULL && curr != delete_node) { // 遍历找到要删除的节点和它前后的节点
  5.     prev = curr;
  6.     curr = curr->next;
  7. }
  8. if (prev == NULL) { // 如果要删除的是头节点
  9.     head = delete_node->next; // 将头指针指向要删除节点的下一个节点
  10. } else { // 如果要删除的是中间节点或尾节点
  11.     prev->next = delete_node->next; // 将前一个节点的指针指向要删除节点的下一个节点
  12. }
  13. free(delete_node); // 释放要删除的节点的内存空间
  1. 遍历链表:

遍历链表通常是通过定义一个指针指向链表头节点,然后循环遍历每个节点的数据元素。例如:

  1. struct Node* curr = head; // 定义指向当前节点的指针,初始化为头节点
  2. while (curr != NULL) { // 循环遍历每个节点
  3.     printf("%d ", curr->data); // 输出当前节点的数据元素
  4.     curr = curr->next; // 将当前节点的指针指向下一个节点
  5. }

以上是链表的基本操作,链表的其他操作还包括反转链表、查找元素等。

  1. 反转链表:

反转链表需要定义一个指针指向当前节点,另一个指针指向下一个节点,然后将两个指针交换位置,直到两个指针相遇为止。例如:

  1. struct Node* reverse_list(struct Node* head) {
  2.     struct Node* prev = NULL; // 定义指向当前节点前一个节点的指针
  3.     struct Node* curr = head; // 定义指向当前节点的指针,初始化为头节点
  4.     struct Node* next = NULL; // 定义指向当前节点后一个节点的指针
  5.     while (curr != NULL) { // 遍历链表
  6.         next = curr->next; // 将当前节点的指针指向下一个节点
  7.         curr->next = prev; // 将当前节点的指针指向前一个节点
  8.         prev = curr; // 将当前节点的前一个节点指针指向当前节点
  9.         curr = next; // 将当前节点的指针指向下一个节点
  10.     }
  11.     return prev; // 返回反转后的链表头节点指针
  12. }
  1. 查找元素:

查找元素需要遍历链表,直到找到目标元素或遍历到链表末尾为止。例如:

  1. int search(struct Node* head, int target) {
  2.     struct Node* curr = head; // 定义指向当前节点的指针,初始化为头节点
  3.     while (curr != NULL) { // 遍历链表
  4.         if (curr->data == target) { // 如果当前节点的数据元素等于目标元素
  5.             return 1; // 返回1表示找到目标元素
  6.         }
  7.         curr = curr->next; // 将当前节点的指针指向下一个节点
  8.     }
  9.     return 0; // 返回0表示未找到目标元素
  10. }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实现员工管理系统(Django页面版 ) 六

本篇博客主要实现用户账号管理&#xff0c;这与之前的账号管理不同&#xff0c;之前的账号管理你可以理解为公司在外面买的一些手机号然后需要发放给员工做内部使用&#xff0c;而本篇博客的用户账号管理主要是为了后续的登录网页实现&#xff0c;那么我们开始今天的项目实现吧…

2. 套圈(分治)

题目 Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded. In the field of Cyberground, the position of each toy is fixed, and the ring is carefully designed so it c…

搭建消息时光机:深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用【RabbitMQ实战 二】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 搭建消息时光机&#xff1a;深入探究RabbitMQ_recent_history_exchange在Spring Boot中的应用 引言前言第一&#xff1a;开启插件支持第二&#xff1a;springboot整合第三&#xff1a;效果展示交换机属…

locust 压测 websocket

* 安装 python 3.8 https://www.python.org/ py --version * 安装 locust pip install locust2.5.1 -i http://pypi.douban.com/simple/ pip install locust2.5.1 -i https://pypi.mirrors.ustc.edu.cn/simple/ locust -V 备注&#xff1a;-i 是切换下载源 * 安装依赖 pip ins…

Electron框架:构建跨平台桌面应用的终极解决方案

文章目录 一、Electron框架简介二、Electron框架的优势1. 开发效率高2. 跨平台性能好3. 易于维护4. 强大的原生能力 三、如何使用Electron框架快速开发跨平台桌面应用1. 安装Electron2. 创建项目文件夹3. 编写主进程代码4. 编写界面代码5. 运行应用 《Electron入门与实战》编辑…

《软件方法》2023版1.1利润=需求-设计1.2 ABCD工作流

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 第1章 建模和UML 牵着你走进傍晚的风里&#xff0c;看见万家灯火下面平凡的秘密。 《情歌唱晚》&#xff1b;词&#xff1a;黄群&#xff0c;曲&#xff1a;黄群&#xff0c;唱&#…

word文档实现“目录索引中标题加粗、前导符(...)和页码不加粗”效果

文章目录 1 展示论文模板需要呈现的效果2 所遇到的问题2.1 情形1&#xff1a;当更新整个目录后&#xff0c;目录中的所有文字都不加粗2.2 情形2&#xff1a;无法单独选中文字部分&#xff0c;如果相对文字部分加粗&#xff0c;则前导符和页码也会同时加粗 3 解决步骤3.1 步骤1&…

CIDR(无类域间路由)与VLSM(可变长度子网掩码)的区别

CIDR和VLSM的介绍 CIDR CIDR&#xff08;Classless Inter-Domain Routing&#xff0c;无类域间路由&#xff09;是一种用于对互联网协议&#xff08;IP&#xff09;地址进行聚合和分配的标准。CIDR的引入旨在解决IPv4地址空间的不足和低效分配的问题。在传统的IP地址规划中&a…

关键点检测之修改labelme标注的json中类别名

import json import os import shutil#source_dir表示数据扩增之后的文件夹路径&#xff0c;此时标注的是多分类的标签 #new_dir表示转化之后得到的二分类文件夹def to2class():#json存放路径source_dir r1#json保存路径new_dir r1for i in os.listdir(source_dir):if i.ends…

文本聚类——文本相似度(聚类算法基本概念)

一、文本相似度 1. 度量指标&#xff1a; 两个文本对象之间的相似度两个文本集合之间的相似度文本对象与集合之间的相似度 2. 样本间的相似度 基于距离的度量&#xff1a; 欧氏距离 曼哈顿距离 切比雪夫距离 闵可夫斯基距离 马氏距离 杰卡德距离 基于夹角余弦的度量 公式…

银行数字化转型导师坚鹏:银行数字化转型正在重塑您的工作

您好&#xff0c;我是银行数字化转型导师坚鹏。坚持知行果合一&#xff0c;赋能数字化转型&#xff01;非常荣幸和您分享关于银行数字化转型如何影响老百姓工作的一些思考。 您知道吗&#xff1f;银行数字化转型给您的工作方式带来新变化、新趋势、新潮流啦&#xff01;在这个…

一分钟解决:vscode卡在“设置SSH主机:VS Code-正在本地下载 VS Code 服务器”

问题&#xff1a;vscode之前可正常使用&#xff0c;更新之后&#xff0c;连接服务器卡住了。 解决&#xff1a;从CMD或者你的终端连接服务器&#xff0c;进入vscode-server目录下&#xff0c;删除一些文件夹就行&#xff0c;然后使用vscode重新链接&#xff0c;它会自动下载新…

系列七、函数

一、函数 1.1、概述 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着&#xff0c;这一段程序或代码MySQL中已经为我们提供好了&#xff0c;我们要做的就是在合适的业务场景调用对应的函数完成相应的业务需求即可。 1.2、分类 按照业务分类&#xff0c;MySQL中…

基于SSM的影视企业全渠道会员管理系统(有报告)。Javaee项目

演示视频&#xff1a; 基于SSM的影视企业全渠道会员管理系统&#xff08;有报告&#xff09;。Javaee项目 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring S…

Python将列表中的数据写入csv并正确解析出来

用Python做数据处理常常会将数据写到文件中进行保存&#xff0c;又或将保存在文件中的数据读出来进行使用。通过Python将列表中的数据写入到csv文件中很多人都会&#xff0c;可以通过Python直接写文件或借助pandas很方便的实现将列表中的数据写入到csv文件中&#xff0c;但是写…

计算机毕业设计 基于SpringBoot的物资管理信息系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

nginx_rtmp_module 之 ngx_rtmp_live_module模块

模块作用 直播模块代码 ngx_rtmp_live_module.c&#xff0c;主要作用是&#xff1a;当客户端推流或者拉流的时候&#xff0c;创建的rtmp session会加入到 live 模块的存储链表中。 模块配置命令 static ngx_command_t ngx_rtmp_live_commands[] {{ ngx_string("live&…

vue3 插槽slot

插槽是子组件中的提供给父组件使用的一个占位符&#xff0c;用 <slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot> 元素。<slot> 元素是一个插槽出口 (slot outlet)&…

蓝桥杯专题-真题版含答案-【骑士走棋盘】【阿姆斯壮数】【Shell 排序法 - 改良的插入排序】【合并排序法】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

李宏毅机器学习2023课程记录(1)--课程介绍

李宏毅机器学习2023课程记录(1)–课程介绍 在这里&#xff0c;记录我最近听的李宏毅老师的机器学习课程的一些笔记和感想&#xff0c;进行归纳总结同时方便后续复习回顾。 注&#xff1a;这门课虽然叫做机器学习&#xff0c;但是李宏毅老师讲课主要以深度学习的技术&#xff0…