首页 > 其他分享 >数据结构-->带头双向循环链表

数据结构-->带头双向循环链表

时间:2023-03-21 13:31:55浏览次数:45  
标签:prev ListNode -- 链表 LTNode phead newnode 数据结构

好了,小伙伴们!!本期我们开始“带头双向循环链表”!!

很显然,这一次要涉及哨兵位了!!而在这之前,单向链表当中没有丝毫提及“哨兵位”的概念!!

其实,这是因为,带哨兵位的单向链表在实际开发和生活当中,并不常用!!

也可以说,价值不大的“带头单向链表”仅仅作为一种参考,是用来拿来练练手的!!

好的!!我们回归到本期的重点:单头双向循环链表

如图所示:

数据结构-->带头双向循环链表_List

那么现在重提一下,什么是 带头双向循环链表 

------>结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表

另外这个结构虽然复杂,但是使用代码实现后会发现结构会带来很多优势,实现反而更简单了!!<-------

相较于“带头单向链表”而言,这种链表有很大的实用价值!!

那就让我们进入代码环节吧!!

-----> 初建 头文件“List.h”

#include <stdio.h>
#inculde <stdlib.h> //扩容函数malloc库
#include <assert.h> //断言检验函数
typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev; //前指针
struct ListNode* next; //后指针
LTDataType data;
};

-----> 测试环节“Test.c”

#include "List.h"

void test_01()
{
ListNode* plist = LTInitial();

LTPushBack(plist, 21);
LTPushBack(plist, 23;
LTPushBack(plist, 24;
LTPushBack(plist, 25);
LTPushBack(plist, 29); //尾插

LTPrint(plist);

LTPopBack(plist);
LTPopBack(plist); //尾删

LTPrint(plist);

}
int main()
{
test_01();
}

-----> 代码实现环节“List.c”

#include "List.h"

//初始化
ListNode* LTInitial()
{
ListNode* phead = LT_BUY(-1); //设置哨兵位
phead ->next = phead;
phead ->prev = phead;
return phead;
}

//开辟空间
ListNode* LT_BUY(LTDataType x)
{
ListNode* newnode = (ListNode*) malloc(sizeof(ListNode));
if(newnode == NULL)
{
perror("malooc::fail");
return NULL;
}
newnode ->next = NULL;
newnode ->prev = NULL;
newnode ->data = x;
return newnode;
}

//打印
void LTPrint(LTNode* phead)
{
printf("<=phead=>");
LTNode* cur = phead ->next;
while(cur != phead)
{
printf("<=%d=>", cur ->data);
cur = cur ->next;
}
printf("\n");
}

//布尔函数判断真假
//注意包含布尔头文件,别忘了
bool boolEmpty(LTNode* phead)
{
if(phead == NULL )
{
return true;
}
else
return false;
}

//尾插数据
void LTPushBack(LTNode* phead, LTDataType x)
{
assert(phead);
LTNode* newnode = LT_BUY(x);
LTNode* tail = phead ->prev;

tail ->next = newnode;
newnode ->prev = tail;
newnode ->next = phead;
phead ->prev = newnode;
}

//尾删数据
void LTPopBack(LTNode* phead)
{
assert(phead);
//还可以用布尔函数进行断言
assert(!boolEmpty(phead));

LTNode* tail = phead ->prev;
LTNode* tailprev = tail ->prev;

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

free(tail);
tail = NULL;
}

现在补充 头文件“List.h”,以及声明实现环节函数

#include <stdio.h>
#inculde <stdlib.h> //扩容函数malloc库
#include <assert.h> //断言检验函数
#include <stdbool.h> //布尔函数

typedef int LTDataType;
typedef struct ListNode
{
struct ListNode* prev; //前指针
struct ListNode* next; //后指针
LTDataType data;
};

//初始化
ListNode* LTInitial();

//开辟空间
ListNode* LT_BUY(LTDataType x);

//打印
void LTPrint(LTNode* phead);

//布尔判断真假
bool boolEmpty(LTNode* phead);

//尾插数据
void LTPushBack(LTNode* phead, LTDataType x);

//尾删数据
void LTPopBack(LTNode* phead);

经测试,执行结果如下:

数据结构-->带头双向循环链表_双向循环链表_02

本期讲解就到这里了!!

感谢小伙伴们的阅读!!

下一期将对“头插 头删”进行优化处理!!敬请期待!!




















标签:prev,ListNode,--,链表,LTNode,phead,newnode,数据结构
From: https://blog.51cto.com/u_15808800/6140149

相关文章

  • 跟着字节AB工具DataTester,5步开启一个实验
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 火山引擎A/B测试平台DataTester孵化于字节跳动业务内部,在字节跳动,“万事皆A/B,一切可......
  • ASEMI代理FS32K146HAT0MLQT原装NXP车规级FS32K146HAT0MLQT
    编辑:llASEMI代理FS32K146HAT0MLQT原装NXP车规级FS32K146HAT0MLQT型号:FS32K146HAT0MLQT品牌:NXP/恩智浦封装:LQFP-144批号:2023+安装类型:表面贴装型FS32K146HAT0MLQT汽......
  • CSS 组合选择符
    CSS组合选择符组合选择符说明了两个选择器之间的关系。CSS组合选择符包括各种简单选择符的组合方式。在CSS3中包含了四种组合方式:后代选择器(以空格   ......
  • 太坑了,我竟然从RocketMQ源码中扒出了7种导致消息重复消费的原因
    大家好,我是三友~~在众多关于MQ的面试八股文中有这么一道题,“如何保证MQ消息消费的幂等性”。为什么需要保证幂等性呢?是因为消息会重复消费。为什么消息会重复消费?明明......
  • 相邻兄弟选择器
    相邻兄弟选择器相邻兄弟选择器(Adjacentsiblingselector)可选择紧接在另一元素后的元素,且二者有相同父元素。如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元......
  • 子元素选择器
    子元素选择器与后代选择器相比,子元素选择器(Childselectors)只能选择作为某元素直接/一级子元素的元素。以下实例选择了<div>元素中所有直接子元素<p>:实例div>p{......
  • operator用于隐式类型转换
    C++中的operator主要有两种作用,一是操作符重载,二是自定义对象类型的隐式转换。在上面提到的point类中,我们提到如果构造函数没有默认参数,隐式转换的时候就会编译出错,但是如......
  • 【线扫相机】-线扫相机行频计算
    线扫相机行频计算一,变量的定义首先设定以下变量:(1)线阵相机的每线像素数(单位:pixel):Hc(2)目标物的宽幅(单位:m):Lo(3)目标物运行速率(单位:m/s):Vo(4)线阵相机线扫描速率(单位:Hz,即线/s):V......
  • Paramiko_Linux
    目录ParamikoSSH第一版第二版最终版SFTP第一版第二版ParamikoParamiko官网从官方的介绍当中我们起码得知以下几个信息:此模块用于python3.6以上,目前python3.11左右,完......
  • 跟着字节AB工具DataTester,5步开启一个实验
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 火山引擎A/B测试平台DataTester孵化于字节跳动业务内部,在字节跳动,“万事皆A/B,......