如何在 C 语言中实现链表?

C语言

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。

分割线

文章目录

  • C 语言中链表的实现
  • 一、链表的基本概念
  • 二、单向链表的节点结构
  • 三、创建链表节点
  • 四、向链表中插入节点
    • 4.1 头插法
    • 4.2 尾插法
  • 五、遍历链表
  • 六、删除链表节点
    • 6.1 删除头节点
    • 6.2 删除指定节点
  • 七、查找链表节点
  • 八、完整的示例代码

分割线


C 语言中链表的实现

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在 C 语言中实现链表可以让我们更灵活地管理数据。

一、链表的基本概念

链表中的节点通常由两部分组成:数据部分和指针部分。数据部分用于存储实际的数据,而指针部分用于指向下一个节点。

链表分为单向链表、双向链表和循环链表等类型。在本教程中,我们将重点介绍单向链表。

二、单向链表的节点结构

在 C 语言中,我们可以使用结构体来定义链表节点的结构:

typedef struct Node {int data;struct Node* next;
} Node;

在上述代码中,data 字段用于存储节点的数据,next 指针用于指向下一个节点。

三、创建链表节点

要创建一个新的链表节点,可以使用以下函数:

Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败\n");return NULL;}newNode->data = data;newNode->next = NULL;return newNode;
}

这个函数首先使用 malloc 函数在内存中分配一个新节点所需的空间。如果内存分配失败,返回 NULL 。然后,将传入的数据赋值给节点的数据字段,并将 next 指针初始化为 NULL

四、向链表中插入节点

4.1 头插法

头插法是将新节点插入到链表的头部。

void insertAtHead(Node** head, int data) {Node* newNode = createNode(data);newNode->next = *head;*head = newNode;
}

在这个函数中,首先创建一个新节点,然后让新节点的 next 指针指向当前的头节点,最后更新头节点指针,使其指向新节点。

4.2 尾插法

尾插法是将新节点插入到链表的尾部。

void insertAtTail(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;return;}Node* curr = *head;while (curr->next!= NULL) {curr = curr->next;}curr->next = newNode;
}

这个函数首先创建一个新节点。如果链表为空,直接将新节点作为头节点。否则,遍历链表找到尾节点,然后将新节点连接到尾节点的后面。

五、遍历链表

遍历链表用于访问链表中的每个节点并处理其数据。

void traverseList(Node* head) {Node* curr = head;while (curr!= NULL) {printf("%d ", curr->data);curr = curr->next;}printf("\n");
}

在这个函数中,从链表的头节点开始,依次访问每个节点并打印其数据,直到遇到 NULL 指针,表示链表结束。

六、删除链表节点

6.1 删除头节点

void deleteHead(Node** head) {if (*head == NULL) {printf("链表为空,无法删除头节点\n");return;}Node* temp = *head;*head = (*head)->next;free(temp);
}

这个函数首先检查链表是否为空。如果不为空,保存头节点的指针,更新头节点指针指向下一个节点,然后释放原来头节点所占用的内存。

6.2 删除指定节点

void deleteNode(Node** head, int data) {Node* curr = *head;Node* prev = NULL;if (curr!= NULL && curr->data == data) {*head = curr->next;free(curr);return;}while (curr!= NULL && curr->data!= data) {prev = curr;curr = curr->next;}if (curr == NULL) {printf("未找到要删除的节点\n");return;}prev->next = curr->next;free(curr);
}

这个函数用于删除指定数据的节点。首先处理头节点,如果头节点的数据就是要删除的数据,更新头节点指针并释放头节点内存。然后遍历链表,找到要删除的节点,更新前一个节点的 next 指针,使其跳过要删除的节点,最后释放要删除节点的内存。

七、查找链表节点

Node* searchNode(Node* head, int data) {Node* curr = head;while (curr!= NULL) {if (curr->data == data) {return curr;}curr = curr->next;}return NULL;
}

这个函数从链表的头节点开始遍历,直到找到数据匹配的节点并返回其指针,如果未找到则返回 NULL

八、完整的示例代码

#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("内存分配失败\n");return NULL;}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;return;}Node* curr = *head;while (curr->next!= NULL) {curr = curr->next;}curr->next = newNode;
}// 遍历链表
void traverseList(Node* head) {Node* curr = head;while (curr!= NULL) {printf("%d ", curr->data);curr = curr->next;}printf("\n");
}// 删除头节点
void deleteHead(Node** head) {if (*head == NULL) {printf("链表为空,无法删除头节点\n");return;}Node* temp = *head;*head = (*head)->next;free(temp);
}// 删除指定节点
void deleteNode(Node** head, int data) {Node* curr = *head;Node* prev = NULL;if (curr!= NULL && curr->data == data) {*head = curr->next;free(curr);return;}while (curr!= NULL && curr->data!= data) {prev = curr;curr = curr->next;}if (curr == NULL) {printf("未找到要删除的节点\n");return;}prev->next = curr->next;free(curr);
}// 查找节点
Node* searchNode(Node* head, int data) {Node* curr = head;while (curr!= NULL) {if (curr->data == data) {return curr;}curr = curr->next;}return NULL;
}int main() {Node* head = NULL;insertAtTail(&head, 10);insertAtTail(&head, 20);insertAtTail(&head, 30);insertAtHead(&head, 5);printf("链表元素: ");traverseList(head);Node* foundNode = searchNode(head, 20);if (foundNode!= NULL) {printf("找到节点: %d\n", foundNode->data);} else {printf("未找到节点\n");}deleteNode(&head, 20);printf("删除节点 20 后链表元素: ");traverseList(head);deleteHead(&head);printf("删除头节点后链表元素: ");traverseList(head);return 0;
}

在上述示例中,我们首先创建了一个空链表,然后通过头插法和尾插法向链表中插入节点。接着遍历链表,查找特定节点,删除指定节点和头节点,并再次遍历链表以验证操作结果。

希望这个详细的解释和示例能帮助您理解如何在 C 语言中实现链表。链表是一种基础但重要的数据结构,掌握它对于进一步学习更复杂的数据结构和算法非常有帮助。


分割线

🎉相关推荐

  • 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
  • 🍅博客首页-关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📙CSDN专栏-C语言修炼
  • 📙技术社区-墨松科技

分割线



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

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

相关文章

集创北方ICN6202 低功耗MIPIDSI转2 PORT LVDS 支持1080P分辨率,成熟批量产品

ICN6202描述&#xff1a; ICN6202是一个接收MIPIDSI输入和发送LVDS输出的桥接芯片。MIPIDSI最多支持4个车道&#xff0c;每个车道的最大运行频率为1Gbps&#xff1b;总最大输入带宽为4Gbps&#xff1b;并且还支持MIPI定义的ULPS&#xff08;超低功耗状态&#xff09;。ICN6202…

【靶机实战】GeoServer 远程代码执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> GeoServer-远程代码执行 原文&#xff1a;【靶机实战】GeoServer 远程代码执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 CVE-2024-36401是一个高危的远程代码执行漏…

Multi-Wing Optimiser风扇选型软件介绍

Multi-Wing Optimiser风扇选型软件

24/07/08数据结构(2.1203)顺序表实现

size属于结构体的作用域 如果要访问一个结构体的指针用-> 如果要访问一个结构体的变量用. 点操作 #include<stdio.h> #include<stdlib.h> #include<string.h> #include"seqlist.h" //typedef struct seqList{ // SLDataType* _data; //需…

【安全设备】堡垒机

一、什么是堡垒机 安全运维审计与风险控制系统即堡垒机&#xff0c;前身为跳板机&#xff0c;跳板机是一个简单的管理设备&#xff0c;但缺乏对运维操作的控制和审计能力。堡垒机是一种特定的网络安全设备&#xff0c;用于在一个网络环境中保护数据和网络不受外部和内部用户的…

【爬虫】Python实现,模拟天眼查登录验证获取token

模拟天眼查登录验证获取token 项目介绍逻辑思路效果演示部分代码展示源代码获取 项目介绍 注&#xff1a;本程序测试时期&#xff1a;2024.7.9&#xff0c;稳定可用 天眼查登录接口升级更新之后&#xff0c;后台接口login接口登录运用了4代极验gt&#xff0c;js逆向部分相当复…

Halcon 拟合测量

* Measure 05: Code generated by Measure 05 *利用测量工具实现 *1采集图像 dev_close_window () read_image (Image, D:/Halcon_Study/gongjian.BMP) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width / 2, Height / 2, black, WindowHandle) set_displa…

ArcGIS的智慧与情怀

初识ArcGIS 在这个信息化的时代&#xff0c;ArcGIS如同一位智者&#xff0c;静静地伫立在地理信息系统的巅峰。初识它时&#xff0c;我仿佛走进了一片未知的领域&#xff0c;心中充满了好奇与期待。ArcGIS&#xff0c;这款专业的地理信息系统软件&#xff0c;凭借其强大的功能…

基于Java中的SSM框架实现暖心家装平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现暖心家装平台系统演示 摘要 自从互联网技术得到大规模的应用以后&#xff0c;传统家装企业面临全新的竞争激烈的市场环境。要想占得当前家装营销与管理的先机&#xff0c;除了要加强内部管理&#xff0c;提高企业内部运营效率&#xff0c;更要积极推进…

TikTok小店推出“百万英镑俱乐部”,实力宠卖家!

TikTok Shop近期在英国市场重磅推出了“百万英镑俱乐部”激励计划&#xff0c;这一举措旨在通过一系列诱人福利&#xff0c;助力商家在TikTok平台上实现销售飞跃。该计划不仅彰显了TikTok Shop对于商家成长的深切关怀&#xff0c;更以实际行动诠释了“实力宠卖家”的承诺。 我…

Python数据分析-天气类型预测分析

一、研究背景 近年来&#xff0c;随着全球气候变化的加剧&#xff0c;天气预报和气象预测变得越来越重要。准确的天气预测不仅能够帮助人们做好日常生活的安排&#xff0c;还能在农业生产、防灾减灾等方面起到关键作用。随着大数据技术和机器学习算法的快速发展&#xff0c;利…

java中 使用数组实现需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求实现&#xff1a; 设计一个java类&#xff0c;java方法&#xff0c;根据用户手动输入的绩点&#xff0c;从而获取到绩点最高的成绩。 实现业务逻辑的代码块 import java.util.Scanner;public class PointDemo {/*** 需求&…

线下线上游戏电竞陪伴APP小程序H5同城线下约玩APP开发,语聊约玩平台搭建游戏陪玩APP源码

开发一款线下陪玩约玩APP的实际意义和在生活中的应用场景 1、满足社交需求:现代社会人们的社交圈往往受到时间、地点和其他限制的影响。线下陪玩约玩APP可以提供一个平台&#xff0c;让用户通过约玩的方式结识新朋友、扩大社交圈 2、解决孤独感:有些人由于工作忙碌、居住环境单…

树莓派采集系统

树莓派&#xff08;Raspberry Pi&#xff09;是一款非常受欢迎的小型单板计算机&#xff0c;因其低成本、低功耗以及丰富的I/O接口&#xff0c;非常适合用来搭建数据采集系统。无论是环境监测、智能家居、工业自动化&#xff0c;还是科学实验&#xff0c;树莓派都能胜任。以下是…

79 单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或…

Smail语句如何使用判断语句跳过验证卡密界面?谈谈思路

&#x1f3c6;本文收录于《CSDN问答解惑》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

从零开学C++:入门

引言&#xff1a;经过C语言和数据结构等编程知识的洗礼&#xff0c;到了暑假&#xff0c;我们就将要踏上C编程语言的学习了&#xff0c;C的学习难度比python等其他语言的学习难度更大&#xff0c;但是我们已经熟练地掌握了C语言的知识&#xff0c;相信学习起来C应该还是会简单许…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-隋朝

隋朝&#xff08;581年-619年&#xff09;是中国历史上承南北朝、下启唐朝的大一统王朝。 581年&#xff0c;杨坚定国号为“隋”&#xff0c;定都大兴城&#xff0c;随后南下灭陈朝&#xff0c;统一中国&#xff0c;结束了自西晋末年以来长达近300年的分裂局面。 杨坚&#xff…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

全新TTT架构:挑战Transformer和Mamba的霸主地位

&#x1f989; AI新闻 &#x1f680; 全新TTT架构&#xff1a;挑战Transformer和Mamba的霸主地位 摘要&#xff1a;斯坦福、UCSD、UC伯克利和Meta研究人员提出了一种全新架构TTT层&#xff0c;取代RNN的隐藏状态&#xff0c;通过梯度下降压缩上下文。TTT层直接替代注意力机制…