当前位置: 首页 > news >正文

【数据结构初阶】--双向链表(一)

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。  

前言:在前面几篇博客中,我们实现了单链表,但是我们的链表其实并不止有单链表这一种形式,严格来说,单链表应该是叫不带头单向不循环链表。那么这篇文章,主要是给大家分享一下链表的分类以及双向链表实现的部分内容,实现形式依旧和之前一样。


目录

一.链表的分类与说明

1.单向或者双向

2.带头或者不带头

3.循环或者不循环

二.双向链表的定义

 三.双向链表中哨兵位头节点的初始化

四.代码展现

List.h:

List.c: 

test.c:


一.链表的分类与说明

--链表的结构非常多样,总共能组合出来8种

我们来一起了解一下这些特性吧

1.单向或者双向

双向链表分为前驱节点和后继节点,不仅能找到当前节点的下一个节点还可以找到上一个节点,使用起来也是很方便的。

2.带头或者不带头

带头链中的头节点,不存储任何有效数据,只用来站岗放哨,我们也称之为"哨兵位" 

在之前的单链表学习中,我们有时候也会把第一个节点表述为头节点,其实这个称呼是不严谨的只是为了方便理解。

3.循环或者不循环

循环链表的尾节点不会指向空,而是指向了第一个节点

虽然有这么多的链表结构,但我们实际中最常用的其实还是两种:单链表(不带头单向不循环链表)和双向链表(带头双向循环链表) ,那我们一起来继续学习双向链表吧


二.双向链表的定义

双向链表中由一个一个的节点组成,这里的节点有三个组成部分,定义我们放在.h文件中

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;//前驱指针,指向前一个指针struct ListNode* prev;//后继指针,指向后一个指针struct ListNode* next;
}ListNode;

 三.双向链表中哨兵位头节点的初始化

--我们在双向链表中哨兵位的头节点是需要初始化一下的,数据随便给个不用的,然后前驱指针和后继指针都指向自己就可以了,具体操作如下所示:

//头节点初始化
void LTInit(ListNode** pphead)
{ListNode* ph = (ListNode*)malloc(sizeof(ListNode));if (ph==NULL){perror("malloc fail!");exit(1);}*pphead = ph;(*pphead)->data = -1;//随便给个不用的就行(*pphead)->prev = *pphead;(*pphead)->next = *pphead;
}

--这里需要用二级指针是因为我们修改了形参且需要改变实参,把原来的空变成哨兵位。

--利用调试发现初始化没有问题


四.代码展现

List.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;
typedef struct ListNode
{LTDataType data;//前驱指针,指向前一个指针struct ListNode* prev;//后继指针,指向后一个指针struct ListNode* next;
}ListNode;//初始化头节点
void LTInit(ListNode** pphead);

List.c: 

#include"List.h"//头节点初始化
void LTInit(ListNode** pphead)
{ListNode* ph = (ListNode*)malloc(sizeof(ListNode));if (ph==NULL){perror("malloc fail!");exit(1);}*pphead = ph;(*pphead)->data = -1;//随便给个不用的就行(*pphead)->prev = *pphead;(*pphead)->next = *pphead;
}

test.c:

#include"List.h"void test1()
{ListNode* plist = NULL;LTInit(&plist);
}
int main()
{test1();return 0;
}

往期回顾: 

【数据结构初阶】--单链表(一)

【数据结构初阶】--单链表(二)

结语:这篇博客中为大家简单介绍了下双向链表,实现了一下哨兵位头节点的初始化,再次提醒一下,大家一定要注意啥时候用一级指针,啥时候用二级指针。在下篇博客中,博主会继续和大家一起实现双向链表中的一些其它接口,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

http://www.dtcms.com/a/286339.html

相关文章:

  • 机器学习17-Mamba
  • C语言—如何生成随机数+原理详细分析
  • Linux服务器端口被占用?
  • 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC04,完成霍尔传感器的驱动代码
  • @Scheduled的作用分析
  • 赛道观察:AI智能自习室哪家强?深挖深度逻辑与价值锚点
  • 链表算法之【链表的中间节点】
  • 【CMake】CMake 项目打包与 find_package 使用流程:从 A 到 B 的完整范例
  • 基于MATLAB的朴素贝叶斯NB的数据分类预测方法应用
  • 一种新颖的可解释人工智能框架,用于整合统计、视觉和基于规则的方法进行医学图像分类|文献速递-医学影像算法文献分享
  • Flutter ScaffoldMessenger 详细介绍
  • P1205 [USACO1.2] 方块转换 Transformations
  • 《通信原理》学习笔记——第四章
  • 【论文阅读】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework
  • Redis——BigKey
  • Radix-4 Booth乘法器计算步骤
  • 【AI论文】CLiFT:面向计算高效与自适应神经渲染的压缩光场标记
  • vue2 面试题及详细答案150道(41 - 60)
  • Node.js链接MySql
  • Vue常见指令
  • Java大厂面试实录:从Spring Boot到AI微服务架构的深度解析
  • 深度学习零基础入门(3)-图像与神经网络
  • UE5 一些关于过场动画sequencer,轨道track的一些Python操作
  • 力扣347:前K个高频元素
  • 科技照亮童心|激光院与跳伞塔社区开展公益活动
  • Day24| 93.复原IP地址、78.子集、90.子集II
  • NIO简单介绍和运用
  • MySQL计数函数count原理分析
  • 深入理解Linux文件I/O:系统调用与标志位应用
  • 区块链加密技术全景解析