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.mfbz.cn/a/251713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…

算法训练第三十九天|62. 不同路径、63. 不同路径 II

62. 不同路径&#xff1a; 题目链接 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有…

边缘分布函数

以二维随机变量说明。 二维随机变量的分布函数为&#xff0c;随机变量的分布函数为&#xff0c;随机变量的分布函数为。 称为二维随机变量关于的边缘分布函数。 称为二维随机变量关于的边缘分布函数。

Python基础05-函数

零、文章目录 Python基础05-函数 1、函数的作用及其使用步骤 &#xff08;1&#xff09;函数的作用 在Python实际开发中&#xff0c;我们使用函数的目的只有一个“让我们的代码可以被重复使用” 函数的作用有两个&#xff1a; ① 代码重用&#xff08;代码重复使用&#xf…

部署LVS的NET模式

实验准备 #负载调度器# 192.168.116.40 #内网 12.0.0.100 #外网 先添加双网卡 #web服务器# 192.168.116.20 #web1 192.168.116.30 #web2 #nfs共享服务# 192.168.116.10 #nfs systemctl stop firewalld setenforce 0 1.nfs共享文件 1…

完美解决:ftp连接遇到 ftp: connect: 拒绝连接 或者 ftp: connect: 没有到主机的路由

目录 问题&#xff1a; 问题一&#xff1a;ftp: connect: 拒绝连接 问题二&#xff1a;ftp: connect: 没有到主机的路由 解决方法&#xff1a; 问题&#xff1a; 问题一&#xff1a;ftp: connect: 拒绝连接 问题二&#xff1a;ftp: connect: 没有到主机的路由 解决方法&#…

Post Json数据与Form表单数据转换器

具体请访问&#xff1a;在线Json转Form表单参数工具

计网 - TCP重传策略大揭秘:确保数据可靠传输的秘诀

文章目录 Pre为什么需要设计重传机制四种常见的重传机制超时重传快速重传SACKD-SACK Pre 计网 - 传输层协议 TCP&#xff1a;TCP 为什么握手是 3 次、挥手是 4 次&#xff1f; 计网 - TCP三次握手原理全曝光&#xff1a;深度解析与实战演示 计网 - TCP四次挥手原理全曝光&am…

浅析LDPC软解码对SSD延迟的影响--part2

2.LDPC&#xff08;Low Density Parity Check&#xff09;纠错码 LDPC码是一种基于稀疏矩阵的纠错码&#xff0c;它由一组奇偶校验方程组成&#xff0c;其中大部分元素为零&#xff0c;因此得名“低密度”。LDPC码的优点是可以有效地纠正大量的错误&#xff0c;尤其是对于高密…

DevOps搭建(十)-安装Harbor镜像仓库详细步骤

1、下载Harbor 官方地址&#xff1a; https://goharbor.io/ 下载地址&#xff1a; https://github.com/goharbor/harbor/tags 选择文档版本进行下载&#xff0c;这里我们选择v2.7.2版本 2、上传到服务器并解压 上传压缩包到服务器后&#xff0c;解压到/usr/local目录下&a…

gin框架

1、go run 文件名 如遇上面问题&#xff1a;go mod tidy 2、查看配置信息&#xff1a;go env 3、windows用set修改配置文件&#xff0c;linux用export修改 4、中间件 (1)、全局中间件 r.Use(中间件函数名()) (2)、Next()方法 (3)、局部中间件 直接将中间件函数名用在…

关于在Java中打印“数字”三角形图形的汇总

之前写过一篇利用*打印三角形汇总&#xff0c;网友需要查看可以去本专栏查找之前的文章&#xff0c;这里利用二维数组嵌套循环打印“数字”三角形&#xff0c;汇总如下&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; /*** 打印如下数字三角形图形*/ public class Wo…

计算机网络基础——IP地址基础知识介绍

一、IP地址简介 计算机网络中的三种地址: 应用层的域名地址DNS(domain name system) 或计算机名称 (结构:计算机主机名.机构名.网络名.最高层域名 ) 网络层的 IP 地址 数据链路层的物理地址(就是“硬件地址”&#xff0c;又称为 MAC 地址&#xff0c;查看MAC: ipconfig/all)…

涉密网络的IP查询防护策略

涉密网络的安全性对于维护国家、企业及个人的核心利益至关重要。在当今数字化时代&#xff0c;网络攻击日益猖獗&#xff0c;其中IP查询是攻击者获取目标信息的一种常见手段。本文将探讨涉密网络中防护IP查询的关键策略&#xff0c;以确保网络的机密性和安全性。 1. 专用VPN和…

Webrtc 学习交流

花了几周的时间研究了一下webrtc &#xff0c;并开发了一个小项目&#xff0c;用来点对点私密聊天 交流传输文件等…后续会继续扩展其功能。 体验地址&#xff0c;大狗子的ID,我在线时可以连接测试到我 f3e0d6d0-cfd7-44a4-b333-e82c821cd927 项目特点 除了交换信令与stun 没…

【JavaWeb】建一个web项目(入门版)

【比较原始的方法】&#xff08;IDEA社区版不能用的&#xff0c;要用学习版&#xff09; 第一步&#xff1a;先建好一个模块 第二步&#xff1a;来到Project Structure->Modules->右键想改造成WebApp的模块&#xff0c;看图 第三步&#xff1a;Artifacts&#xff0c;你…

深入解析Spring Boot集成MyBatis的多种方式

文章目录 1. 引言2. 传统的XML配置方式2.1 引入依赖2.2 配置数据源和MyBatis2.3 编写Mapper接口和XML映射文件2.4 使用Mapper 3. 注解配置方式3.1 引入依赖3.2 配置数据源和MyBatis3.3 编写Mapper接口3.4 使用Mapper 4. MyBatis动态SQL4.1 使用XML配置方式4.2 使用注解配置方式…

KaiwuDB 获评信通院 2023 大数据“星河”标杆案例

12月6日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601) 共同组织的 2023 大数据“星河(Galaxy)”案例评选结果正式公示&#xff0c;“基于 KaiwuDB 的台区云储能示范项目”历经多环节严苛评审&#xff0c;从累计 706 份申报项目中…

sql宽字节注入

magic_quotes_gpc&#xff08;魔术引号开关&#xff09; https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据&#xff0c;如包括有&#xff1a;post、get、cookie过来的数据增加转义字符“\”&#xff0c;以…
最新文章