数据结构--双向链表专题

目录

    • 1. 双向链表的结构
    • 2. 实现双向链表
      • 预先的准备
      • 初始化
      • 尾插、头插
      • 尾删、头删
      • 查找
      • 在pos位置之后插⼊数据
      • 删除pos位置的数据
    • 3. 顺序表和双向链表的分析

1. 双向链表的结构

在这里插入图片描述
注意:这里的“带头”跟前面我们说的“头结点”是两个概念,为了更好的理解直接称为单链表的头结点

带头链表里的头结点,实际为“哨兵位”,哨兵位节点不存储任何有效数字,知识站在这里“放哨”

“哨兵位”存在的意义:
遍历循环链表避免死循环

2. 实现双向链表

预先的准备

在这里插入图片描述

typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}LTNode;

初始化

注意,双向链表是带有哨兵位的,插入数据之前链表中必须要先初始化一个哨兵位

void LTInit(LTNode** pphead)
{*pphead = (LTNode*)malloc(sizeof(LTNode));if (*pphead == NULL){perror("malloc");exit(1);}(*pphead)->data = -1;(*pphead)->next = (*pphead)->prev = *pphead;
}

当链表中只有哨兵位节点的时候,我们称该链为空链表
即哨兵位是不能删除也不能修改的,即不能对哨兵位进行任何操作

尾插、头插

在这里插入图片描述

在这里插入图片描述

//不需要改变哨兵位,则不需要传二级指针
//如果需要修稿哨兵位的话,则传二级指针
//尾插
LTNode* LTBuyNode(LTDataType  x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malloc");exit(1);}newnode->data = x;newnode->next = newnode->prev = newnode; 
}
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode->next = phead;newnode->prev = phead->prev;phead->prev->next = newnode;phead->prev = newnode;
}//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);//phead newnode phead->nextnewnode->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;phead->next = newnode;
}

单链表中涉及到二级指针:单链表中的phead(第一个节点)可能为空
双向链表中不需要二级指针:双向链表中的phead(哨兵位)不可能为空

尾删、头删

在这里插入图片描述

在这里插入图片描述

//头删、尾删
void LTPopBack(LTNode* phead)
{assert(phead);//链表为空:只有一个哨兵位assert(phead->next != phead);/*phead->prev->prev->next = phead;phead->prev = phead -> prev->prev*/LTNode* del = phead->prev;LTNode* prev = del->prev;prev->next = phead;phead->prev = prev;free(del);del = NULL;
}
//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* del = phead->next;LTNode* next = del->next;next->prev = phead;phead->next = next;free(del);del = NULL;
}

查找

LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}

在pos位置之后插⼊数据

在这里插入图片描述

/在pos位置之后插⼊数据
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);//pos newnode pos->nextnewnode->next = pos->next;newnode->prev = pos;pos->next->prev = newnode;pos->next = newnode;}

删除pos位置的数据

在这里插入图片描述

void LTErase(LTNode* pos)
{assert(pos);pos->next->prev = pos->prev;pos->prev->next = pos->next;free(pos);pos = NULL;
}

3. 顺序表和双向链表的分析

不同点顺序表链表(单链表)
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持 O(N)
任意插入或者删除元素可能需要搬移元素,效率低只需要修改指针指向
插入动态顺序表,空间不够时需要扩展没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁

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

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

相关文章

软考43-上午题-【数据库】-关系代数转SQL语言

一、投影转SQL语言-select 示例: 二、选择转SQL语言-where 示例: 【注意】: 关系代数公式的写法,可以写属性名,也可以写列的序号,如: 但是,SQL语言不支持!!&a…

Java核心-核心类与API(4)

话接上回,继续核心类与API的学习,最后介绍一下Object类以及与数学、日期/时间有关的类,就结束该部分的学习了,其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类,也是所有类的父类…

淘宝镜像地址停止运行了 安装插件是失败如果解决

由于淘宝镜像目前已经停止更新运营了,所以导致在使用npm install安装无法成功 先查看一下安装镜像 npm config get registry //查看当前是不是淘宝镜像如果是新的淘宝镜像 重新安装新的淘宝镜像 npm config set registry https://registry.npmmirror.com/ 再次查看…

JavaWeb 自己给服务器安装SQL Server数据库遇到的坑

之前买的虚拟主机免费送了一个SQL Server数据库,由于服务器提供商今年下架我用的那款虚拟主机产品,所以数据库也被收回了。我买了阿里云云服务器,但是没有数据库,于是自己装了一个SQL Server数据库,总结一下遇到的坑。…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

nginx之状态页 日志分割 自定义图表 证书

5.1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 server{…

【计算机科学引论 Computing Essentials 2021】【名词术语】【第7章】

Computing Essentials Chapter 7: Secondary Storage 二级存储 MATCHING Match each numbered item with the most closely related lettered item. Write your answers in the spaces provided. Choices a. DVD (Digital Versatile Disc) b. file compression c. hi-def…

UE5 文字游戏(1) 仅UI截图转换为texture2d(适用于window端)

目录 需求 思路 1.截图并读取到本地 2.本地读取图片并转换为纹理2d 效果展示 找了好多的解决办法&#xff0c;都不管用。这个算是折中的。 需求 将当前的用户控件&#xff08;ui&#xff09;截图下来&#xff0c;并赋值到一个texture2d上。 我的需求&#xff1a;文字游戏…

matlab simulink变压器温度仿真

1、内容简介 略 48-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab simulink变压器温度仿真_哔哩哔哩_bilibili 4、参考论文 略 大型油浸风冷变压器绕组温度场分析_高原 基于顶层油温的变压器绕组热点温度计算改进模型_陈伟根 基于热电类比理论的油浸式电…

Oracle内存计算应用模式

前言 内存计算是利用内存来加速数据访问和应用的性能&#xff0c;并降低应用开发复杂度的技术。近十年来&#xff0c;随着软硬件技术的发展和用户需求的成熟&#xff0c;内存计算技术已经得到了广泛地应用。 Oracle在内存计算领域具有非常重要的地位&#xff0c;这主要得益于…

【JavaEE】_HttpServlet类

目录 1. init方法 2. destory方法 3. service方法 4. servlet生命周期 前文已经提及到&#xff1a;servlet是tomcat提供的&#xff0c;用于操作HTTP协议的一组API&#xff0c;可以将这组API理解为HTTP服务器的框架&#xff1b; 编写一个servlet程序&#xff0c;往往都要继…

怎么样避免被企业裁掉呢?

在当前经济环境下&#xff0c;许多企业纷纷选择裁员以降低成本、提升效益。面对这一现象&#xff0c;员工如何避免成为裁员风波中的牺牲品呢&#xff1f;本文将从多个角度为您提供应对策略。 首先&#xff0c;要了解企业裁员的背景和原因。金融危机、行业变革、市场竞争等外部…