数据结构(C达到)------- 双链表
双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点。
双向链表结点的类型描写叙述:
//双向链表的类型描写叙述
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *prior,*next;
}DuLNode,*DuLinkList;
当中。prior域存放的是其前驱结点的存储地址,next域存放的是其后继结点的存储地址。
双向链表有两个特点:一是能够从两个方向搜索某个结点,这使得链表的某些操作(如插入和删除)变得比較简单; 二是不管利用前链还是后链都能够遍历整个双向链表。
双向链表的操作基本和单链表的操作同样。
1. 头插法创建带头结点的双向链表Create_DLinkListF(int n)
//头插法创建带头结点的双向链表
DuLinkList Create_DLinkListF(int n){
DuLinkList L,p;
int i = n - 1;
ElemType x;
//新建头结点
L = (DuLinkList)malloc(sizeof(DuLNode));
L->prior = NULL;
L->next = NULL; //加入第一个结点
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
L->next = p;
p->prior = L;
p->next = NULL; //加入其它结点
while(i > 0){
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x; p->next = L->next;
L->next->prior = p;
p->prior = L;
L->next = p; i--;
}
return L;
}
2. 尾插法创建带头结点的双向链表Create_DLinkListR(int n)
//尾插法创建带头结点的双向链表
DuLinkList Create_DLinkListR(int n){
DuLinkList L,p,lastNode;
int i = n - 1;
ElemType x;
//新建头结点
L = (DuLinkList)malloc(sizeof(DuLNode));
L->prior = NULL;
L->next = NULL; //加入第一个结点
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
L->next = p;
p->prior = L;
p->next = NULL; lastNode = p;
//加入其它结点
while(i > 0){
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x; lastNode->next = p;
p->prior = lastNode;
p->next = NULL; lastNode = p;
i--; }
return L; }
3. 在指定结点之前插入新结点Insert_DLinkListBefore(DuLinkList p,ElemType x)
//在指定结点之前插入新结点
void Insert_DLinkListBefore(DuLinkList p,ElemType x){
DuLinkList newNode;
//推断结点p之前的结点的合法性:
if(p->prior == NULL)
printf("结点不合法。不能在该结点之前插入结点\n");
else{
newNode = (DuLinkList)malloc(sizeof(DuLNode));
newNode->data = x; newNode->next = p;
p->prior->next = newNode;
newNode->prior = p->prior;
p->prior = newNode;
}
}
4. 在指定结点之后插入新结点Insert_DLinkListAfter(DuLinkList p,ElemType x)
//在指定结点之后插入新结点
void Insert_DLinkListAfter(DuLinkList p,ElemType x){ DuLinkList newNode;
newNode = (DuLinkList)malloc(sizeof(DuLNode));
newNode->data = x; //当插入位置是最后一个结点之后时
if(p->next == NULL){
p->next = newNode;
newNode->prior = p;
newNode->next = NULL;
}
else{
newNode->next = p->next;
p->next->prior = newNode;
p->next = newNode;
newNode->prior = p;
}
}
5. 删除指定结点Delete_DLinkList(DuLinkList p)
//删除指定结点
void Delete_DLinkList(DuLinkList p){
//假设删除的是最后一个元素
if(p->next == NULL)
p->prior->next = NULL; else{
p->prior->next = p->next;
p->next->prior = p->prior; }
free(p);
}
6. 后链输出双向链表Print_DLinkListN(DuLinkList L)
//后链输出双向链表
void Print_DLinkListN(DuLinkList p){ while(p != NULL){
printf("%d\t",p->data);
p = p->next;
}
printf("\n"); }
7.前链输出双向链表Print_DLinkListP(DuLinkList p)
//前链输出双向链表
void Print_DLinkListP(DuLinkList p){ while(p != NULL){
printf("%d\t",p->data);
p = p-prior;
}
printf("\n");
}
至于双向链表的其它操作。如定位。和单链表的操作类同,不再赘述。
版权声明:本文博主原创文章,博客,未经同意不得转载。
数据结构(C达到)------- 双链表的更多相关文章
- [C++11][数据结构]自己的双链表实现
这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式 ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- 深入理解Redis 数据结构—双链表
在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现
双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...
- JAVA 链表操作:单链表和双链表
主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...
- Java数据结构和算法之链表
三.链表 链结点 在链表中,每个数据项都被包含在‘点“中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中 ...
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
随机推荐
- 《Android内核剖析》读书笔记 第13章 View工作原理【View树遍历】
View状态分类 在View视图中定义了多种和界面效果相关的状态,比如拥有焦点Focused.按下Pressed等,不同的状态一般会显示不同的界面效果,而且视图状态会随着用户的操作而改变,一般通过xm ...
- Nginx将请求分发到各web应用
介绍了VMWare12虚拟机.Linux(CentOS7)系统安装.部署Nginx1.6.3代理服务做负载均衡.接下来介绍通过Nginx将请求分发到各web应用处理服务. 一.Web应用开发 1.as ...
- ACdream: Sum
Sum Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticN ...
- python学习笔记之11:图像用户界面
这里会介绍如何创建python程序的图像用户界面(GUI),也就是那些带有按钮和文本框的窗口等.目前支持python的所谓“GUI工具包”的有很多,本文简要介绍最成熟的跨平台pythonGUI工具包- ...
- 【ArcGIS 10.2新特性】ArcGIS 10.2 for Desktop 新特性(一)
ArcGIS 10.2 for Desktop是在10.1的成功基础上进行的改进,它的改进包括:性能提升.附加的安全性.40多个新的分析工具.3D功能提高.栅格增强.新的地理数据管理能力以及其它更多的 ...
- 编译gRPC
编译gRPC 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义 ...
- C#中的关键字
abstract event new struct as explicit null switch base extern object this bool false operator throw ...
- 命令模式(CommandPattern)
今天主要学习命令模式,java获得创意.其他屏幕教程.这里总结一下命令模式更重要. 刚开始以为命令模式是非常罕见的外观,但研究发现,他与同样单身完成.有设计模式最简单的集中模式. 象,然后其它的类直接 ...
- 重新想象 Windows 8 Store Apps (6) - 控件之媒体控件: Image, MediaElement
原文:重新想象 Windows 8 Store Apps (6) - 控件之媒体控件: Image, MediaElement [源码下载] 重新想象 Windows 8 Store Apps (6) ...
- oracle 优化or 更换in、exists、union all几个字眼,测试没有问题!
oracle 优化or 更换in.exists.union几个字眼.测试没有问题! 根据实际情况选择相应的语句是.假设指数,or全表扫描,in 和not in 应慎用.否则会导致全表扫描. sele ...