C语言之双链表理解与应用

  其实网上也有好多关于双链表理解,知乎上同样有写的很好文章。这里主要看双链表概念,应用场景,举例。

1,双链表概念

        双链表是一种更复杂的线性数据结构,它由一系列节点组成,每个节点包含数据元素和两个链接,这两个链接分别指向前一个节点和下一个节点。

        双链表的主要优点是它可以从两个方向进行遍历,这使得在双链表中的插入和删除操作更加高效。与单链表相比,双链表在插入和删除节点时不需要遍历整个链表,因此时间复杂度更低。

        在双链表中,每个节点包含一个数据元素和两个链接。前驱链接指向当前节点的上一个节点,后继链接指向当前节点的下一个节点。这种结构使得我们可以从任何节点开始向前或向后遍历整个链表。

        在创建新的双链表节点时,我们需要为前驱和后继链接分配内存并初始化它们。同时,我们还需要为数据域分配内存并存储数据元素。

        双链表的主要操作包括初始化、打印、尾插、尾删、头插、头删、任意插入、任意删除、查找、更改等。这些基本操作与单链表类似,但双链表具有更高的灵活性和效率。

        总的来说,双链表是一种非常有用的数据结构,它可以在需要双向遍历或在链表中间进行插入和删除操作的场合中使用。

双链表的基本操作包括以下几种:

(1)、创建链表:初始化一个空的双链表。

(2)、插入节点:在链表的头部、尾部或中间插入新的节点。

(3)、删除节点:从链表中删除指定的节点。

(4)、查找节点:在链表中查找特定的节点。

(5)、打印链表:遍历链表并打印出每个节点的数据。

(6)、清空链表:删除链表中的所有节点。

这些基本操作在双链表的操作中非常常见,可以用于创建、修改和查看双链表。

2,双链表适合哪些场景

双链表适合用于以下场景:

(1)、需要频繁在链表中间插入或删除节点的场合。双链表相比于单链表,可以更快地找到某个节点的前驱节点和后继节点,因此在插入和删除节点时效率更高。

(2)、需要从两个方向遍历链表的场合。双链表的每个节点都保存了前驱节点和后继节点的指针,因此可以从任何一个节点开始向前或向后遍历整个链表。

总的来说,双链表提供了更高的灵活性和效率,尤其是在需要双向遍历或在链表中间进行插入和删除操作的场合。

3,双链表操作的例子,包括插入节点、删除节点和打印链表的操作:

#include <stdio.h>  
#include <stdlib.h>  // 定义双链表节点  
struct Node {  int data;  struct Node* prev;  struct Node* next;  
};  // 在链表头部插入新节点  
void insertAtHead(struct Node** head, int data) {  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  newNode->data = data;  newNode->prev = NULL;  newNode->next = *head;  if (*head != NULL) {  (*head)->prev = newNode;  }  *head = newNode;  
}  // 在链表尾部插入新节点  
void insertAtTail(struct Node** head, int data) {  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  newNode->data = data;  newNode->prev = NULL;  newNode->next = NULL;  if (*head == NULL) {  *head = newNode;  return;  }  struct Node* current = *head;  while (current->next != NULL) {  current = current->next;  }  current->next = newNode;  newNode->prev = current;  
}  // 删除指定节点  
void deleteNode(struct Node** head, int data) {  if (*head == NULL) {  return;  }  if ((*head)->data == data) {  *head = (*head)->next;  if (*head != NULL) {  (*head)->prev = NULL;  }  free((*head)->prev);  return;  }  struct Node* current = *head;  while (current->next != NULL && current->next->data != data) {  current = current->next;  }  if (current->next != NULL) {  current->next = current->next->next;  if (current->next != NULL) {  current->next->prev = current;  } else {  current->prev->next = NULL;  }  free(current->next);  }  
}  // 打印链表  
void printList(struct Node* head) {  struct Node* current = head;  while (current != NULL) {  printf("%d ", current->data);  current = current->next;  }  printf("\n");  
}  // 主函数  
int main() {  struct Node* head = NULL; // 初始化链表头为空  insertAtHead(&head, 1); // 在链表头部插入节点1,此时链表为 1 -> NULL  insertAtTail(&head, 2); // 在链表尾部插入节点2,此时链表为 1 -> 2 -> NULL  insertAtTail(&head, 3); // 在链表尾部插入节点3,此时链表为 1 -> 2 -> 3 -> NULL  insertAtHead(&head, 0); // 在链表头部插入节点0,此时链表为 0 -> 1 -> 2 -> 3 -> NULL  deleteNode(&head, 2); // 删除节点2,此时链表为 0 -> 1 -> 3 -> NULL,注意删除后需要更新节点的prev指针。  printList(head); // 打印链表:0 1 3,注意打印时需要遍历整个链表。  return 0;  
}

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

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

相关文章

C语言初学6:判断

一、if 语句 #include<stdio.h> int main() {// 定义局部变量int a 10;// 使用if语句检查布尔条件if(a < 20){/* 如果为真&#xff0c;输出下面语句 */printf("a 小于 20\n");}printf("a 的值是 %d\n", a);return 0; } 执行结果是&#xff1a;…

蓝桥杯time模块常用操作

#导入time模块import time #获取时间戳 start_time time.time () print ( "start_time ", start_time) time .sleep ( 3) end_time time.time () print ( "end_time ", end_time)#计算运行时间 print("运行时间 { :.0f } ".format(end_time …

(已解决)如何使用matplotlib绘制小提琴图

网上很多人使用seaborn绘制小提琴图&#xff0c;本人暂时不想学新的东西&#xff0c;就是懒。本文介绍如何使用matplotlib绘制小提琴图&#xff0c;很多其他博客只是使用最简单的语法&#xff0c;默认小提琴颜色会是蓝色&#xff0c;根本改不了。本文使用了一点高级的用法&…

DataFunSummit:2023年数据平台架构峰会-核心PPT资料下载

一、峰会简介 一、数据平台架构的发展趋势 随着数字化转型的加速&#xff0c;数据平台架构的发展趋势越来越明显。在本次峰会上&#xff0c;与会者讨论了数据平台架构的未来发展方向&#xff0c;包括云原生、微服务、分布式等。这些趋势将对企业数据平台架构产生深远影响&…

springcloud:对象存储组件MinIO

类似于FastDFS/HDFS的一个文件存储服务&#xff01; SpringBoot整合MinIO实现分布式文件服务&#xff01; #MinIO简介&#xff1f; Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;基于Apache License v2.0开源协议&#xff0c;虽然轻量&#xff0c;却拥有着不错的…

python requests最全使用指南

文章目录 前言安装 ReuqestsHTTP 简介什么是 HTTPHTTP工作原理HTTP的9种请求方法HTTP状态码 requests 快速上手requests 发起请求的步骤requests 发起请求的两种方式请求参数发起 GET 请求发起 POST 请求 requests 实战登录接口的测试获取用户信息接口的测试对响应结果的处理&a…

如何写出高效的软件测试用例?

编写测试用例的目的就是确保测试过程全面高效、有据可查。所以测试用例非常重要&#xff0c;但要编写出高效的测试用例&#xff0c;需要搞清楚什么是测试用例&#xff0c;以及如何编写出高效的测试用例&#xff1f;接下来将从以下几个部分来进行展开 1、什么是测试用例 2、如何…

D35|整数拆分+不同的二叉搜索树

96.不同的二叉搜索树 初始思路&#xff1a; 一开始需要推导递推公式也就是需要找规律&#xff1a; 我认为的规律是 dp[0] 1; dp[1] 1; dp[2] 2; dp[3] dp[2]dp[1]xdp[1]dp[2]5; dp[4] dp[3]dp[2]xdp[1]dp[1]xdp[2]dp[3]; dp[5] dp[4]dp[1]xdp[3]dp[2]xdp[2]dp[3…

Web前端-HTML(初识)

文章目录 1.认识WEB1.1 认识网页&#xff0c;网站1.2 思考 2. 浏览器&#xff08;了解&#xff09;2.1 五大浏览器2.2 查看浏览器占有的市场份额 3. Web标准&#xff08;重点&#xff09;3.1 Web 标准构成结构表现行为 1.认识WEB 1.1 认识网页&#xff0c;网站 网页主要由文字…

2024年手把手带你安装fl studio for mac 21.2.2.3470图文激活教程

音乐在人们心中的地位日益增高&#xff0c;近几年音乐选秀的节目更是层出不穷&#xff0c;喜爱音乐&#xff0c;创作音乐的朋友们也是越来越多&#xff0c;音乐的类型有很多&#xff0c;好比古典&#xff0c;流行&#xff0c;摇滚等等。对新手友好程度基本上在首位&#xff0c;…

【数据结构】八大排序之直接插入排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.直接插入排序简介及思路 直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法. 它的基本操作是: 将一个数据插入到已经排好的有序表中,从而得到一个新的,数…

中付-机构交易流水通知内容

把你的接口部署到线上之后&#xff0c;跟中付的人说一下&#xff0c;他们就会把你的接口与你的服务商号进行关联。 每当有自己服务商名下pos机交易时就会自动推送到你的接口&#xff0c;这不是实时的&#xff0c;可能会有几分钟的延时。 dataList是一个数组&#xff0c;一般为…

代码评审——静态map初始化并赋值问题

问题描述&#xff1a; 在程序开发过程中&#xff0c;经常使用到Map来进行数据的处理。但在开发过程中&#xff0c;当使用静态Map时&#xff0c;初始化数据会存在一些危险的情况。 可以参考如下示例代码&#xff1a; public static Map<String,String> staticMap new H…

Makefile 应用

Makefile 应用 实验介绍 由于在后面课程中会一直使用 Makefile 编译程序,因此还是需要将 Makefile 单独讲解一番。 Makefile 可以在 linux 和 windows 下使用,一般在 linux 下使用较多,这是因为 windows 下已经有很多集成 IDE (如微软的 visual studio C++ 系列、Qt C++…

IDA pro软件 如何修改.exe小程序打开对话框显示的文字?

环境: Win10 专业版 IDA pro Version 7.5.201028 .exe小程序 问题描述: IDA pro软件 如何修改.exe小程序打开对话框显示的文字? 解决方案: 一、在IDA Python脚本中编写代码来修改.rdata段中的静态字符串可以使用以下示例代码作为起点(未成功) import idc# 定义要修…

【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1

【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1 文章目录 前言一、RR机器人创建description pkg创建demos pkg 二、创建controller相关创建example pkg 三、测试运行总结 前言 本系列文件主要有以下目标和内容&#xff1a; 为系统、传感器和执行器创建 Har…

如何访问AWS私有网络中的RDS (Mysql)

文章目录 小结问题及解决连接问题如何使用本地的Mysql Workbench对RDS进行访问 参考 小结 在AWS私有网络中部署了RDS (Mysql), 尝试通过外网成功地进行了访问. 问题及解决 连接问题 在AWS私有网络中部署了RDS (Mysql), 进行外网进行访问碰到了各种问题. 以下连接超时&…

Go标准包之flag命令行参数解析

1.介绍 在 Go中&#xff0c;如果要接收命令行参数&#xff0c;需要使用 flag 包进行解析。不同的参数类型可以通过不同的方法接收。 2.参数接受 2.1 接受方式 使用flag接收参数&#xff0c;可以由以下三种方式接受&#xff1a; 方式一: flag.Type(name,defaultVal,desc)方…

【精选】计算机网络教程(第6章应用层)

目录 前言 第6章应用层 1、URL的格式 2、HTTP请求报文的一些方法 3、HTTPS和HTTP的区别 4、电子邮件 5、文件传送协议&#xff08;FTP&#xff09; 前言 总结计算机网络教程课程期末必记知识点。 第6章应用层 1、URL的格式 定义格式 <协议>&#xff1a;//<主…

计算机毕业设计 基于SpringBoot的大学生创新创业项目管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…