【C语言】双链表

news2024/9/23 15:31:04

🦄个人主页:小米里的大麦-CSDN博客

🎏所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客

🎁代码托管:黄灿灿/数据结构 (gitee.com)

⚙️操作环境:Visual Studio 2022

目录

一、什么是双链表?

二、双链表温习

1. 双链表的结构

2. 基本操作

3. 双链表讲解说明

三、代码示例(链表 · 59b38b6 · 黄灿灿/数据结构 - Gitee.com)

1. 头文件

2. 函数源文件

3. 测试代码用例

4. 小结

四、总结

共勉


一、什么是双链表?

在数据结构中,链表是一种线性数据结构,其中元素不是在内存中连续存储的,而是通过指针链接在一起。双链表是链表的一种形式,每个节点包含三个部分:一个数据字段两个指针字段,分别指向其前驱节点后继节点。这种结构允许从任意方向遍历链表。

如果提前脑海里有一定的双链表形式/样例,一定会大大帮助我们进行理解,毕竟数据结构的核心思想是图,是画图!所以,不妨看看这个:双链表 数据结构与算法c语言,完整代码动画版_哔哩哔哩_bilibili.(有一定的认识就不需要啦!)

二、深入认识双链表

1. 双链表的结构

在C语言中,双链表可以通过结构体来定义。一个典型的双链表节点结构如下:
typedef struct Node {
    int data; // 存储数据
    struct Node *prev; // 指向前一个节点
    struct Node *next; // 指向下一个节点
} Node;

2. 基本操作

对于双链表,我们通常需要实现以下几种基本操作:

  • 创建空链表
  • 插入节点
  • 删除节点
  • 遍历链表
  • 查找节点
  • 获取链表长度
  • 清空链表

3. 双链表讲解说明

本篇文章主要讲解的是带头双向循环链表。
带头双向循环链表: 结构最复杂 ,一般用在单独存储数据。实际中使用的链表数据结构,都是带双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。(前提是 【C语言】最详细的单链表(两遍包会!)-CSDN博客 可以手拿把掐哦!)

三、代码示例(链表 · 59b38b6 · 黄灿灿/数据结构 - Gitee.com

虽然双链表的结构相比单链表更复杂了,但正是由于双链表很“对称”,有规律,所以实现起来更方便了。

1. 头文件

#pragma once
//Double linked list:双链表

#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<stdbool.h>

typedef struct Double_linked_list
{
	struct Double_linked_list* prev;
	int data;
	struct Double_linked_list* next;
}DLL;

//创建一个新的节点:Create a new node
DLL* Cnew_node(int x);


//初始化空的双向循环链表,返回指向头结点的指针,initialize:初始化
DLL* init_list();


//打印链表内容
void print(DLL* phead);


//检查链表是否为空:Check if the linked list is empty
bool empty(DLL* phead);


//尾插:Tail plugging
void tail_plug(DLL* phead, int x);


//头插:Header
void header(DLL* phead, int x);


//在给定的位置 pos 插入一个包含 x 的新节点:Insert a new node containing x at the given location pos
void insert(DLL* pos, int x);

2. 函数源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "Double linked list.h"

//Double linked list:双链表

//创建一个新的节点:Create a new node
DLL* Cnew_node(int x)
{
	DLL* newnode = (DLL*)malloc(sizeof(DLL));
	if (newnode == NULL)
	{
		perror("malloc fail");
		//exit(-1);//如果分配内存失败,则终止程序
	}

	newnode->data = x;
	newnode->next = NULL;
	newnode->prev = NULL;

	return newnode;
}


//初始化空的双向循环链表,返回指向头结点的指针,initialize:初始化
DLL* init_list()
{
	DLL* phead = Cnew_node(-1);

	phead->next = phead;
	phead->prev = phead;

	return phead;
}


//打印链表内容
void print(DLL* phead)
{
	assert(phead);

	printf("<->head<->");
	DLL* temp = phead->next;

	while (temp != phead)
	{
		printf("%d<->", temp->data);
		temp = temp->next;
	}

	printf("\n");
}


//检查链表是否为空:Check if the linked list is empty
bool empty(DLL* phead)
{
	assert(phead);

	return phead->next == phead;
}


//尾插:Tail plugging
void tail_plug(DLL* phead, int x)
{
	assert(phead);

	insert(phead, x);
}


//头插:Header
void header(DLL* phead, int x)
{
	assert(phead);

	insert(phead->next, x);
}


//在给定的位置 pos 插入一个包含 x 的新节点:Insert a new node containing x at the given location pos
void insert(DLL* pos, int x)
{
	assert(pos); // 确保 pos 不是 NULL

	DLL* prev = pos->prev; // 获取 pos 节点的前一个节点
	DLL* newnode = Cnew_node(x); // 创建一个包含数据 x 的新节点

	// 更新 prev 节点的 next 指针,使其指向新节点
	prev->next = newnode;

	// 设置新节点的 prev 指针,使其指向 prev 节点
	newnode->prev = prev;

	// 设置新节点的 next 指针,使其指向 pos 节点
	newnode->next = pos;

	// 更新 pos 节点的 prev 指针,使其指向新节点
	pos->prev = newnode;
}


3. 测试代码用例

#define _CRT_SECURE_NO_WARNINGS 1
#include "Double linked list.h"

//Double linked list:双链表

int main() {
    // 初始化链表
    DLL* list = init_list();

    // 测试空链表检查
    printf("列表是空的吗? %s\n", empty(list) ? "Yes" : "No");

    // 测试头插
    header(list, 10);
    header(list, 20);
    header(list, 30);

    // 打印链表内容
    printf("头部插入后的列表:\n");
    print(list);

    // 测试尾插
    tail_plug(list, 40);
    tail_plug(list, 50);
    tail_plug(list, 60);

    // 打印链表内容
    printf("尾部插入后的列表:\n");
    print(list);

    // 测试插入到指定位置
    insert(list->next->next, 25); // 在第二个节点之后插入25
    printf("在第二个元素后插入 25 后的列表:\n");
    print(list);

    // 再次检查链表是否为空
    printf("列表是空的吗? %s\n", empty(list) ? "Yes" : "No");

    // 销毁链表(注意:实际代码中应实现销毁函数)
    // destroy_list(list); // 假设实现了这个函数

    return 0;
}

4. 小结

当你看到这里的时候就会发现:双链表代码比单链表的代码会短很多,而且双链表最主要的其实就是那个插入函数,如果对上述有注释的代码还存在疑惑,不妨画一画图,会极大方便我们进行理解!如果是一头雾水,那基本上是单链表不过关,可以再回去研究研究:【C语言】最详细的单链表(两遍包会!)-CSDN博客

四、总结

在这篇文章中,我们介绍了双链表的基本概念,并展示了如何使用C语言来创建和操作双链表。双链表相比于单链表提供了更多的灵活性,因为我们可以轻松地向前或向后移动。然而,这种额外的功能也带来了更高的存储开销,因为每个节点都需要额外的指针来保存前驱节点的信息。

以上就是关于C语言中双链表的介绍,希望对你有所帮助!

共勉

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

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

相关文章

Windows 11 Build 27686 上手体验:2TB FAT32、更好的沙盒等功能

Windows 11 Build 27686 现已在 Insider Program 的 Canary 频道发布&#xff0c;其中包含一些有趣的内容。该版本确认了微软更改 FAT32 大小限制的计划&#xff0c;并将其大小限制从 32GB 提高到 2TB。与此同时&#xff0c;沙盒也得到了改进。让我们来详细了解一下此次更新。 …

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…

Xinstall神器来袭:落地页与App无缝衔接,用户转化不再是难题

在移动互联网时代&#xff0c;App的推广与运营成为了各行各业的关键一环。然而&#xff0c;许多推广者在落地页跳转App这一环节上遇到了不小的挑战。用户点击落地页后&#xff0c;往往需要经过繁琐的步骤才能跳转到App&#xff0c;这不仅降低了用户体验&#xff0c;还严重影响了…

红明谷CTF 2022

MissingFile 前置知识 DPAPI&#xff1a; 全称&#xff1a;Data Protection Application Programming Interface DPAPI blob 一段密文&#xff0c;可以使用Master Key对其解密 Master Key 64字节&#xff0c;用于解密DPAPI blob&#xff0c;使用用户登录密码、SID和16字…

周易测算系统前景分析

周易测算系统作为一种结合传统文化与现代技术的服务平台。其市场前景分析如下&#xff1a; 市场需求增长&#xff1a;随着人们对传统文化的重视和对个性化服务的追求&#xff0c;周易测算系统市场需求正逐渐增长。特别是在互联网的背景下&#xff0c;周易预测服务与互联网的结…

java: 错误: 不支持发行版本

报这样的错误大概率是 idea 中的版本配置不统一导致的 通过确保四个位置的版本一致&#xff0c;解决版本不同的问题 第一个位置&#xff1a;Project ,确保 SDK 和 Project language level 的版本适配 第二个位置&#xff1a;Modules,确保需要运行的模块的 Language level 正确…

本地下载安装WampServer结合内网穿透配置公网地址远程访问详细教程

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

AI浪潮下的教育革新:把握机遇,拥抱变化!

在全球范围内&#xff0c;AI技术正以前所未有的速度改变着我们的生活和工作方式。据麦肯锡数据预测&#xff0c;到2045年左右&#xff0c;有50%的工作将被AI替代。与此同时&#xff0c;具有创造力、深度思考的高阶智力的人才&#xff0c;将享受到AIGC带来的效率优势&#xff0c…

Maven的依赖范围

依赖的jar包&#xff0c;默认情况下&#xff0c;可以在任何地方使用&#xff0c;可以通过scope来设置作用范围 作用范围&#xff1a; 主程序范围有效&#xff08;main文件夹范围内&#xff09;测试程序范围有效&#xff08;test文件夹范围内&#xff09;是否参与打包运行&…

HTML静态网页成品作业(HTML+CSS)——古诗词网设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 &#x1…

产线一直在用的 RabbitMQ 搭建教程(含负载均衡配置,验证脚本,监控案例),偷偷抄出来的,建议收藏备用

本文介绍公司一直在用的 rabbitmq 集群安装部署过程&#xff0c;版本不算太新&#xff0c;但一直稳定运行&#xff0c;对其他版本安装也有一定的参考价值&#xff0c;建议收藏备用。 简介 官网&#xff1a;https://www.rabbitmq.com/ RabbitMQ 是一个开源的遵循 AMQP(Advance…

超详细的Vue新手向教程

一&#xff0c;前言 本篇文章的正文部分为渐近式介绍Vue基础中的OptionAPI和相关指令&#xff0c;在两大内容之外&#xff0c;本文结尾处会附上vue的特性。 ps:本文总字数过22000&#xff0c;足够详细&#xff0c;尽量新手向的同时也包含一些原理性知识&#xff0c;部分内容…

TILs 评分:TCGA 肿瘤浸润淋巴细胞病理切片深度学习评分!图片下载与可视化

生信碱移 病理切片的TILs评分 TCGA 数据库是最大的肿瘤组学公开数据库之一。尽管如此&#xff0c;更多的研究往往仅局限于关注 TCGA 中各类肿瘤样本的上游组学信息或基本病理特征&#xff0c;而忽略了对样本数字化 H&E 病理染色图像的进一步应用。 ▲ TCGA中肿瘤样本的病…

Centos系统中创建定时器完成定时任务

Centos系统中创建定时器完成定时任务 时间不一定能证明很多东西&#xff0c;但是一定能看透很多东西&#xff0c;坚信自己的选择&#xff0c;不动摇&#xff0c;使劲跑&#xff0c;明天会更好。 在 CentOS 上&#xff0c;可以使用 systemd 定时器来创建一个每十秒执行一次的任务…

拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值

挖掘数据背后的规律是数学建模的重要任务&#xff0c;拟合与插值是常用的分析方法 掌握拟合与插值的基本概念和方法熟悉Matlab相关程序实现能够从数据中挖掘数学规律 拟合问题的基本提法 拟合问题的概念 已知一组数据(以二维为例)&#xff0c;即平面上n个点 ( x i , y i ) …

Blazor开发框架Known-V2.0.8

V2.0.8 Known是基于Blazor的企业级快速开发框架&#xff0c;低代码&#xff0c;跨平台&#xff0c;开箱即用&#xff0c;一处代码&#xff0c;多处运行。目前已有部分客户在使用&#xff0c;最近客户的项目和产品&#xff0c;有的在Docker中运行&#xff0c;有的在重新升级改造…

2024.8.18周报

摘要 本周利用阳朔水站的数据对1D浅水方程进行了求解&#xff0c;通过将1D浅水方程的物理约束纳入到神经网络&#xff0c;将时空坐标x&#xff0c;t作为输入到神经网络中&#xff0c;得到预测解水深和流量的数据&#xff0c;然后利用真实的数据进行比较&#xff0c;计算损失。…

【鸿蒙学习】HarmonyOS应用开发者基础 - 白皮书V3.0的关键知识点

本文内容由智谱清言的长文章解读生成。 智谱AI&#xff08;https://zhipuai.cn/&#xff09; 白皮书V3.0这份文档详细介绍了鸿蒙生态应用开发的各个方面&#xff0c;涵盖了从核心概念到开发流程、测试和运维分析的各个环节。由于这本书有128页&#xff0c;读完时间较长&#xf…

Java数组02:数组内存分析、三种初始化方式及特点

本节内容视频链接&#xff1a;Java数组03&#xff1a;三种初始化及内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p53&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.数组内存分析 堆&#xff1a;存放new的对象和数组&#xff1b;可以被所有线…

【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)

目录&#xff1a; 目录&#xff1a; 系统介绍&#xff1a; 系统开发技术 Python语言 Django框架简介 MySQL数据库技术 B/S架构 系统设计 系统总体设计 系统详细界面实现&#xff1a; 系统测试 测试目的 测试用例 本章小结 参考代码&#xff1a; 为什么选择我&…