C语言:链表

链表是一种常见的线性数据结构,其中每个元素(称为节点)包含两部分:数据和指向下一个节点的指针。链表的主要优点是插入和删除操作的时间复杂度较低,但随机访问的效率不如数组。

1. 链表的基本概念

  • 节点(Node):链表的基本单元,包含数据和指向下一个节点的指针。
  • 头节点(Head):链表的第一个节点。
  • 尾节点(Tail):链表的最后一个节点,其指针通常为 NULL。
  • 空链表:没有节点的链表,头节点指针为 NULL。

链表是一种常见的数据结构,它由一系列节点组成。每个节点包含两部分:数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点,从而将各个节点连接起来。链表可以动态地分配内存,方便地进行插入和删除操作。

2. 链表的操作

常见的链表操作包括:

  • 插入:在链表的某个位置插入一个新节点。
  • 删除:从链表中删除一个节点。
  • 查找:在链表中查找一个节点。
  • 遍历:遍历链表中的所有节点。

3. 实例

下面是一个用C语言实现单向链表的示例:

#include <stdio.h>
#include <stdlib.h>// 定义节点结构
typedef struct Node {int data;struct Node* next;
} Node;// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("Memory allocation failed\n");exit(1);}newNode->data = data;newNode->next = NULL;return newNode;
}// 在链表头部插入节点
void insertAtHead(Node** head, int data) {Node* newNode = createNode(data);newNode->next = *head;*head = newNode;
}// 在链表尾部插入节点
void insertAtTail(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {Node* current = *head;while (current->next != NULL) {current = current->next;}current->next = newNode;}
}// 删除链表中的节点
void deleteNode(Node** head, int data) {if (*head == NULL) {printf("List is empty\n");return;}if ((*head)->data == data) {Node* temp = *head;*head = (*head)->next;free(temp);return;}Node* current = *head;while (current->next != NULL && current->next->data != data) {current = current->next;}if (current->next == NULL) {printf("Node with value %d not found\n", data);return;}Node* temp = current->next;current->next = current->next->next;free(temp);
}// 查找链表中的节点
Node* search(Node* head, int data) {Node* current = head;while (current != NULL) {if (current->data == data) {return current;}current = current->next;}return NULL;
}// 遍历链表并打印所有节点
void printList(Node* head) {Node* current = head;while (current != NULL) {printf("%d -> ", current->data);current = current->next;}printf("NULL\n");
}// 清空链表
void clearList(Node** head) {Node* current = *head;while (current != NULL) {Node* temp = current;current = current->next;free(temp);}*head = NULL;
}int main() {Node* head = NULL;insertAtHead(&head, 10);insertAtHead(&head, 20);insertAtTail(&head, 30);printList(head);  // 输出: 20 -> 10 -> 30 -> NULLdeleteNode(&head, 10);printList(head);  // 输出: 20 -> 30 -> NULLNode* foundNode = search(head, 30);if (foundNode != NULL) {printf("Found node with value: %d\n", foundNode->data);} else {printf("Node not found\n");}clearList(&head);printList(head);  // 输出: NULLreturn 0;
}
  • 代码解释

    • 节点结构 Node:包含一个整数 data 和一个指向下一个节点的指针 next。
    • 创建新节点 createNode:分配内存并初始化节点的数据和指针。
    • 在链表头部插入节点 insertAtHead:创建新节点并将其插入到链表的头部。
    • 在链表尾部插入节点 insertAtTail:创建新节点并将其插入到链表的尾部。
    • 删除链表中的节点 deleteNode:从链表中删除指定值的节点。
    • 查找链表中的节点 search:在链表中查找指定值的节点。
    • 遍历链表并打印所有节点 printList:遍历链表并打印所有节点的数据。
    • 清空链表 clearList:释放链表中所有节点的内存并设置头节点为 NULL。
    • 主函数 main:
      • 创建一个空的链表 head。
      • 插入一些节点并打印链表。
      • 删除一个节点并打印链表。
      • 查找一个节点并输出结果。
      • 清空链表并打印链表。
  • 运行结果:
    在这里插入图片描述

链表的优势在于其动态大小、高效的插入和删除操作、灵活的内存使用。链表适合需要频繁插入和删除元素的场景,尤其是当元素数量不确定时。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

webpack配置

4-3vue-loader测试_哔哩哔哩_bilibili 一.新建文件夹vue_todo&#xff0c;vscode打开 二.ctrl打开终端&#xff0c;输入npm init -y&#xff0c;快速生成一个默认的package.json文件 之后左边出现项目初始化文件package.json 三.接下来需要webpack完成打包&#xff0c;所以安装…

字节跳动辞退103人

大家好&#xff0c;我是程序员面试刷题平台的鸭鸭&#xff01; 在前阵子实习生破坏大模型训练事件之后&#xff0c;字节又上了一次热搜。 鸭鸭吃完瓜&#xff0c;只能说&#xff0c;社会险恶啊同学们&#xff01; 5 号&#xff0c;字节跳动内部发布了年内第四份《企业纪律与职…

大型语言模型综述 A Survey of Large Language Models

文章源自 2303.18223 (arxiv.org) 如有侵权&#xff0c;请通知下线 这是一篇关于大语言模型&#xff08;LLMs&#xff09;的综述论文&#xff0c;主要介绍了 LLMs 的发展历程、技术架构、训练方法、应用领域以及面临的挑战等方面&#xff0c;具体内容如下&#xff1a; 摘要…

服务器作业4

[rootlocalhost day04]# vim 10.sh [rootlocalhost day04]# cat 10.sh #通过shell脚本分析部署nginx网络服务 #1.接收用户部署的服务名称 read -p "服务名称:(nginx)" server if [ $server ! nginx ];then echo "输入的不是nginx,脚本退出" exit 1…

Linux基础(二十)——程序管理与 SELinux 初探

程序管理与 SELinux 初探 1. 程序和进程2.程序调用流程3. 一个bash中的多任务工作管理4.进程管理4.1 查询进程4.2 进程的执行顺序 5.系统资源的观察6. /proc/* 代表的意义7.SELinux 1. 程序和进程 2.程序调用流程 程序与进程之间的关系&#xff1a; 从上图可以看出&#xff0…

vue3 路由写法及传参方式 !超详细

Vue Router 是 Vue.js 官方的路由管理器。它主要用于单页面应用程序&#xff08;SPA, Single Page Application&#xff09;中&#xff0c;帮助解决页面导航、组件复用等问题。 基本的使用 1.router配置文件代码 创建一个ts文件,用来写路由器 // 创建一个路由器,并暴露出去 …

MATLAB绘制正四面体、正六面体

MATLAB绘制正四面体、正六面体 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% 正四面体&#xff08;Tetrahedron&#xff09; % 顶点坐标&#xff08;正四面体的顶点位于一个正方体的对角线上&#xff0c;并经过适当缩…

一文了解 inductive bias(归纳偏好)

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 归纳偏好&#xff08;Inductive Bias&#xff09;是机器学习中的一个非常基础但又非常重要的概念。为了更好地理解它&#xff0c;我们先从 “归纳” 和 “偏好” 这两个词开始讲解。 什么是归纳&#x…

leetcode844:比较含退格的字符串

题干 题目分析 两个字符串要进行比较&#xff0c;#代表着回车&#xff0c;也就是删除之前的字符。 若按照遍历的惯例&#xff0c;选择从前到后遍历&#xff0c;但这样没法判断&#xff0c;因为#之前被删除的部分是不需要相同的。 因此考虑到#的含义&#xff0c;我们应该选择从…

【Python爬虫实战】从入门到精通:全面解析IP代理池的原理与实战应用

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、IP代理池 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;主要功能 &#xff08;三…

c++_day2

第一题&#xff1a; 继续为 mystring类编写以下方法&#xff1a; 1&#xff1a;析构函数&#xff0c;释放buf指向的堆空间 2&#xff1a;编写 append(const mystring r) 为当前字符串尾部,拼接新的字符串r 3&#xff1a;编写 isEqual(const mystring r) 判断当前字符串和 字符串…

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项&#xff08;曼哈顿距离&#xff09; 2.3.2…

基于一种基于OCR图像识别技术的发票采集管理系统及方法

本发明涉及了一种基于OCR图像识别技术的发票采集管理系统及方法&#xff0c;该系统的发票信息采集单元采集发票图片信息数据&#xff0c;OCR图像识别单元基于OCR图像识别技术并结合人工智能深度学习算法对发票图片信息数据进行识别读取以获得OCR图像识别结果&#xff0c;发票信…

Windows注册表基础学习

修改注册表让cmd ascii输出有颜色 reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1 如何打开注册表编辑器 运行regedit 按下"Winr"组合键&#xff0c;在打开的"运行"对话框中输入"regedit"&#xff0c;单击"确定"…

CarSim复制数据注意事项

更正&#xff0c;上图中提到的“数据集”应该是“数据类别”&#xff0c;可以理解为数据集的一个子集。

Spring:注解开发依赖注入

Spring为了使用注解简化开发&#xff0c;并没有提供构造函数注入、setter注入对应的注解&#xff0c;只提供了自动装配的注解实现。 直接上代码&#xff1a; 1&#xff0c;添加一个配置类SpringConfig Configuration ComponentScan("com.itheima") //PropertySourc…

springboot006基于SpringBoot的网上订餐系统(源码+包运行+LW+技术指导)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【Linux】learning notes(2)

文章目录 1、快捷键2、专业名词2.1、驱动2.2、内核2.3、U-Boot2.4、Dynamic Library and Static Library2.5、SDK / NDK / UDK 3、BUG 前文链接&#xff1a; 【Linux】learning notes 1、快捷键 在文件夹里&#xff0c;ctrll&#xff0c;选定文件夹路径 Linux下的ctrl常用组合…

商业银行核心系统单元化改造的研究与思考

随着金融科技的快速发展&#xff0c;银行核心系统面临着更高的处理能力、扩展能力及业务连续性的要求与挑战。为应对这些挑战&#xff0c;许多银行开始考虑对其核心系统进行单元化改造。本文首先分析了传统银行核心系统存在的问题以及单元化改造的必要性&#xff0c;然后详细阐…

指针

内存和地址 内存 我们知道计算上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们电脑上的哪些内存空间如何高效的管理呢&#xff1f; 其实也是把内存划分为一个个的…