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

python 双向链表_双向链表及创建(C语言)详解

目前我们所学到的链表,无论是动态链表还是静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为单向链表(或双向链表(简称双链表)。

从名字上理解双向链表,即链表是 "双向" 的,如图 1 所示:

1H11B048-0.gif

图 1 双向链表结构示意图

双向,指的是各节点之间的逻辑关系是双向的,但通常头指针只设置一个,除非实际情况需要。

从图 1 中可以看到,双向链表中各节点包含以下 3 部分信息(如图 2 所示):

指针域:用于指向当前节点的直接前驱节点;

数据域:用于存储数据元素。

指针域:用于指向当前节点的直接后继节点;

1H1162357-1.gif

图 2 双向链表的节点构成

因此,双链表的节点结构用 C 语言实现为:

typedef struct line{

struct line * prior; //指向直接前趋

int data;

struct line * next; //指向直接后继

}line;

双向链表的创建

同单链表相比,双链表仅是各节点多了一个用于指向直接前驱的指针域。因此,我们可以在单链表的基础轻松实现对双链表的创建。

需要注意的是,与单链表不同,双链表创建过程中,每创建一个新节点,都要与其前驱节点建立两次联系,分别是:

将新节点的 prior 指针指向直接前驱节点;

将直接前驱节点的 next 指针指向新节点;

这里给出创建双向链表的 C 语言实现代码:

line* initLine(line * head){

head=(line*)malloc(sizeof(line));//创建链表第一个结点(首元结点)

head->prior=NULL;

head->next=NULL;

head->data=1;

line * list=head;

for (int i=2; i<=3; i++) {

//创建并初始化一个新结点

line * body=(line*)malloc(sizeof(line));

body->prior=NULL;

body->next=NULL;

body->data=i;

list->next=body;//直接前趋结点的next指针指向新结点

body->prior=list;//新结点指向直接前趋结点

list=list->next;

}

return head;

}

我们可以尝试着在 main 函数中输出创建的双链表,C 语言代码如下:

#include

#include

//节点结构

typedef struct line{

struct line * prior;

int data;

struct line * next;

}line;

//双链表的创建函数

line* initLine(line * head);

//输出双链表的函数

void display(line * head);

int main() {

//创建一个头指针

line * head=NULL;

//调用链表创建函数

head=initLine(head);

//输出创建好的链表

display(head);

//显示双链表的优点

printf("链表中第 4 个节点的直接前驱是:%d",head->next->next->next->prior->data);

return 0;

}

line* initLine(line * head){

//创建一个首元节点,链表的头指针为head

head=(line*)malloc(sizeof(line));

//对节点进行初始化

head->prior=NULL;

head->next=NULL;

head->data=1;

//声明一个指向首元节点的指针,方便后期向链表中添加新创建的节点

line * list=head;

for (int i=2; i<=5; i++) {

//创建新的节点并初始化

line * body=(line*)malloc(sizeof(line));

body->prior=NULL;

body->next=NULL;

body->data=i;

//新节点与链表最后一个节点建立关系

list->next=body;

body->prior=list;

//list永远指向链表中最后一个节点

list=list->next;

}

//返回新创建的链表

return head;

}

void display(line * head){

line * temp=head;

while (temp) {

//如果该节点无后继节点,说明此节点是链表的最后一个节点

if (temp->next==NULL) {

printf("%d\n",temp->data);

}else{

printf("%d <-> ",temp->data);

}

temp=temp->next;

}

}

程序运行结果:

1 <-> 2 <-> 3 <-> 4 <-> 5

链表中第 4 个节点的直接前驱是:3

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于提高自己JAVA水平的十大技术讨论(转)
  • python语言格式化_python语言-字符串格式
  • 写给那些正在找工作的朋友
  • js 文件不让通过地址访问_Flask Vue.js全栈开发|第2章:通过axios访问Flask RESTful API
  • 串行接口SPI接口应用设计
  • docker compose 安装_利用docker-compose安装elasticsearch时启动失败的异常解决
  • 清华计算机系旁听有感
  • python中怎样寻找某一时间序列的极值_Python的10个基础知识点,新手必须背下来...
  • 可变长字符串以及数字与字符串的互转
  • mac mysql可视化工具_tableau 连接mysql的操作步骤
  • python pprint_Python3内置模块之pprint让打印比print更美观
  • JBoss目录结构说明和功能介绍
  • jqgrid使用本地静态数据创建网格的例子_第68集 python机器学习:网格搜索管道中的属性...
  • 探讨C#2.0对象模型
  • XML文件转换成Word文件或者Excel文件
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Android组件 - 收藏集 - 掘金
  • Git初体验
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • js操作时间(持续更新)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • npx命令介绍
  • Object.assign方法不能实现深复制
  • Puppeteer:浏览器控制器
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vuex 学习笔记 01
  • 初识 webpack
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 记一次删除Git记录中的大文件的过程
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 利用jquery编写加法运算验证码
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 删除表内多余的重复数据
  • 通过git安装npm私有模块
  • 项目管理碎碎念系列之一:干系人管理
  • 一个项目push到多个远程Git仓库
  • 一些css基础学习笔记
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ## 1.3.Git命令
  • #if和#ifdef区别
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (力扣题库)跳跃游戏II(c++)
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (学习日记)2024.01.19