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

[数据结构]双向带头循环链表制作

前面我们有提到,单向不带头循环链表的制作

这里我们介绍一个双向带头循环链表的制作方法

双向带头循环链表的示意图如下

带头指针的作用体现在哪呢?

第一、防止头节点为空,既有头结点,头指针始终指向头结点,那么无论链表是否为空,头指针均不为空;没有头结点,头指针就为NULL

第二、有头结点时,插入/删除第一个结点时,空链表/非空链表操作逻辑一致,不需要额外判断

第三、插入或者删除头结点的时候不需要改变头节点,只需要改变头结点的下一个即可

带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都 是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带 来很多优势,实现反而简单了。

具体哪里简单我们可以来看一下双向循环列表的代码

Dlist.h文件

#pragma once
//带头双向循环链表 
//实现增删查改功能
#include <stdio.h>
#include <stdlib.h>
#define datatype int
typedef struct Doublelist
{struct Doublelist* pre;datatype x;struct Singlelist* next;
}DL;
//扩容动态内存
DL* buystorage();
//初始化带头双向循环链表
void init(DL** head);
//打印双向循环链表
void printDL(DL* head);
//查找输入值
DL* findlist(const DL* head, datatype input);
//前向输入
void pushfront(DL* head, datatype input);
//后向输入
void pushback(DL* head, datatype input);
//前向删除
void popfront(DL* head);
//后向删除
void popback(DL* head);
//插入指定位置
void insertpos(DL* head, int pos, datatype input);
//修改指定位置
void modifylist(DL* head, int pos);

Dlist.c文件

#include "D_LIst.h"
DL* buystorage()
{DL* temp = (DL*)malloc(sizeof(DL));return temp;
}
void init(DL** head)
{DL* temp = buystorage();temp->next = temp;temp->pre = temp;*head = temp;
}
void printDL(DL* head)
{DL* temp = head;printf("HEAD -> ");while (head->next != temp){head = head->next;printf("%d -> ", head->x);}printf("HEAD\n");
}
const DL* findpos(const DL* head, int pos)
{int count = 1;DL* temp = head;while (count < pos){count++;temp = temp->next;}return temp;
}
const void insert(DL*pos, datatype input)
{DL* temp = buystorage();temp->x = input;DL* pre = pos->pre;pre->next = temp;temp->next = pos;pos->pre = temp;temp->pre = pre;
}
void pushfront(DL* head, datatype input)
{insert(head->next, input);
}
void pushback(DL* head, datatype input)
{insert(head, input);
}
const void erase(DL* pos)
{if (pos->next = pos){printf("没有任何数据,请先输入数据");return;}DL* temppre = pos->pre;DL* tempnext = pos->next;temppre->next = tempnext;free(pos);pos = NULL;
}
void popfront(DL*head)
{erase(head->next);
}
void popback(DL* head)
{erase(head->pre);
}
void insertpos(DL* head, int pos,datatype input)
{DL* findedpos = findpos(head, pos+1);insert(findedpos, input);
}
DL* findlist(const DL* head, datatype input)
{DL* temp = head;while (temp->next != head){temp = temp->next;if (input == temp->x){printf("输入的%d找到了\n",input);return temp;}}printf("输入的%d没找到\n",input);return NULL;
}
void modifylist(DL* head, int pos , datatype input)
{DL* findedpos = findpos(head, pos + 1);findedpos->x = input;
}

test.c文件

#include "D_LIst.h"void test1()
{DL* Doublelist = NULL;init(&Doublelist);pushfront(Doublelist, 3);pushfront(Doublelist, 4);pushfront(Doublelist, 5);pushfront(Doublelist, 6);printDL(Doublelist);pushback(Doublelist, 3);pushback(Doublelist, 4);pushback(Doublelist, 5);pushback(Doublelist, 6);printDL(Doublelist);popfront(Doublelist);printDL(Doublelist);popback(Doublelist);printDL(Doublelist);insertpos(Doublelist, 3, 44);printDL(Doublelist);findlist(Doublelist, 44);findlist(Doublelist, 10);modifylist(Doublelist, 3, 1000);printDL(Doublelist);
}void main()
{test1();
}

这部分代码增删查改的步骤都比较简单,读者可以自行根据代码标识进行阅读,

需要注意的是,里面仍有一些判断可以完善,如有需要可以自行完善,这部分代码仅仅是一个简单的带头双向循环链表的制作

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • rust-tokio发布考古
  • 少儿编程 2024年3月电子学会图形化编程等级考试Scratch二级真题解析(判断题)
  • 函数重载和引用【C++】
  • Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码
  • git lfs如何使用
  • AI-漫画推文
  • 二维数组及其内存图解
  • 云手机提供私域流量变现方案
  • 如何在Java中创建对象输入流
  • WPF Pack
  • C# 字符串和枚举类型互相转换
  • 007 spring aop(通知)(xml)
  • fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化
  • 整数和(推公式)
  • MongoDB复制集安装配置图文教程-Windows篇 fasstgpt必看
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • co模块的前端实现
  • Java 网络编程(2):UDP 的使用
  • js面向对象
  • leetcode-27. Remove Element
  • Linux快速复制或删除大量小文件
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • PHP 的 SAPI 是个什么东西
  • Python实现BT种子转化为磁力链接【实战】
  • rc-form之最单纯情况
  • win10下安装mysql5.7
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 服务器从安装到部署全过程(二)
  • 诡异!React stopPropagation失灵
  • 精彩代码 vue.js
  • 入手阿里云新服务器的部署NODE
  • 小程序01:wepy框架整合iview webapp UI
  • 携程小程序初体验
  • 一个项目push到多个远程Git仓库
  • 2017年360最后一道编程题
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # dbt source dbt source freshness命令详解
  • #define、const、typedef的差别
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (4)logging(日志模块)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (SpringBoot)第二章:Spring创建和使用
  • (独孤九剑)--文件系统
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • .gitattributes 文件