双向链表插入、删除操作
来源:http://blog.csdn.net/csdanca11/article/details/7173856
双向链表
循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但时间耗费是O(n)。如果希望从表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的每个结点里再增加一个指向其前驱的指针域prior。这样形成的链表中就有两条方向不同的链,我们可称之为双(向)链表(DoubleLinked List)。双链表的结构定义如下:
typedef structDNode { ElemType data; struct DNode*prior,*next; }DNode,*DoubleList; |
双链表的结点结构如图2.14所示。
与单链表类似,双链表一般也是有头指针唯一确定的,增加头结点也能使双链表的某些运算变得方便。同时双向链表也可以有循环表,称为双向循环链表,其结构如图2.15所示。
由于在双向链表中既有前向链又有后向链,寻找任一个结点的直接前驱结点与直接后继结点变得非常方便。设指针p指向双链表中某一结点,则有下式成立:
P->prior->next=p=p->next->prior |
在双向链表中,那些只涉及后继指针的算法,如求表长度、取元素、元素定位等,与单链表中相应的算法相同,但对于前插和删除操作则涉及到前驱和后继两个方向的指针变化,因此与单链表中的算法不同。
1.双向链表的前插操作
算法描述:欲在双向链表第i个结点之前插入一个新的结点,则指针的变化情况如图2.16所示。
intDlinkIns(DoubleList L,int i,ElemType e) { DNode *s,*p; … … s=(DNode*)malloc(sizeof(DNode)); if(s) { s->data=e; s->prior=p->prior;p->prior->next=s; s->next=p;p->prior=s; return TRUE; } else teturn fALSE; } 算法双向链表的插入操作 |
2.双向链表的删除操作
算法描述:欲删除双向链表中的第i个结点,则指针的变化情况如图2.17所示。
intDlinkDel(DoubleList L,int i,ElemType *e)
{
DNode *p;
…
…
*e=p->prior->next=p->next;
p->next->prior->p=p->prior;
free(p);
return TRUE;
}
双向链表插入、删除操作相关推荐
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- mysql 插入删除操作_MySQL——增删改操作
插入语句 一次插入操作只插入一行数据 insert into [tablename](listname1,listname2,......) values (value1,value2,......) ...
- 数据结构-----AVL树的插入删除操作
对于AVL的插入和删除,主要利用的就是上篇文章所述的四种旋转操作,根据插入后不同的结构选用不同的方式复原平衡. 再次声明一下,http://www.cnblogs.com/QG-whz/p/51672 ...
- 浅析B树、B+树插入删除操作(附代码实现)
首先自平衡树是为了解决二叉搜索树在有序数据中退化为链表的问题(即查找时间退化为 O(n) 级别). 自平衡树中,B树.B+树可以说是最简单的,没有旋转.变色等操作.我们可以拿多路平衡查找树和同样是自平 ...
- (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)
目录 一.普通的顺序存储队列 二.循环队列 (1)少用一个元素空间 i.初始化队列操作: iii.入队操作: iv.出队操作: (2)设置flag标志 i.初始化队列操作: ii.判断队空操作: ii ...
- 详细介绍红黑树 性质 定义 插入删除操作
红黑树 定义 节点是红色或黑色 根结点一定是黑色 所有叶子节点都是黑色(指的是null) 每个红色节点的两个子节点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色节点) 从任意节点到其每个叶子 ...
- 链栈常规插入删除操作
#include <stdio.h> #include <stdlib.h> typedef int DataType; struct Node {DataType data; ...
- 快速了解B+树的插入、删除操作
B+树非常的复杂,这里不进行详细的讲解,只对基本的插入删除操作进行说明. 在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶节点中,各叶节点用指针连接.因此在进行插入删除操作时,要进行调整, ...
- 如何实现双向链表的插入、删除操作
如何实现双向链表的插入.删除操作 循环单链表的出现,虽然能够实现从任一结点出发沿着链能找到其前驱结点,但是时间复杂度为O(N).如果希望能从链表中快速确定某一个结点的前驱,另一个解决方法就是在单链表的 ...
最新文章
- Python整型数与字符串相互转换
- python 三元表达式 if for 构建List 进阶用法
- 【实战】MATLAB+神经网络+MNIST
- python tablewidget 颜色_【整理】PyQt如何修改QTableView中表格颜色即如何修改QModelIndex颜色 | 勤奋的小青蛙...
- RuntimeError: readexactly() called while another coroutine is already waiting for incoming data
- queryList爬虫获取内容的几种方法总结 queryList给抓取的内容增加html追加元素html 代码实例...
- 110-简单类型之整数类型和小数类型
- react实现异步插件_React-loadable实现组件进行异步加载
- 【学习笔记】网络层——无分类编址CIDR、ARP协议、DHCP协议和ICMP协议
- linux 网络路径中网络协议栈有几种,linux网络路径中网络协议栈有几种
- 性能计时器监测服务器性能瓶颈
- 网络、通信术语及概念
- 向量积 和 它的计算_7
- Httpd2.4简介及CenOS6.6下编译安装
- php整数和浮点数比较,php 浮点数怎么进行比较?
- xlsx文件打开乱码_excel打开xls文件全是乱码怎么办?excel打开xls乱码的修复方法
- 人体全身骨骼神经分布图,人体骨骼神经系统图片
- qq服务器上的文件删除后如何恢复,QQ文件失效怎么恢复(过期的QQ文件如何申请恢复)...
- 创业公司怎样才能有效的进行员工股权激励
- 使用ROS驱动激光雷达YDLIDAR-G4的详细过程总结(教你避开使用的各种坑....)
热门文章
- 我所理解的高通UEFI之display的流程和移植
- 奥的斯机电物联网中心和现代化改造展厅在杭州启幕
- 2021-01-09T18:00:00.000Z格式时间存数据库,字段类型为datetime,直接出现报错
- Java基础之面向对象部分详解
- 唐诗android代码,Android 唐诗宋词软件(源码讲解)
- COGNOS安装笔记
- windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(二)——代码运行问题解决
- Linux Mint 18.2 安装与调整
- 通信原理包络是什么意思_2021年通信原理考研题库
- 告别交通拥堵和数据孤岛,区块链成智慧交通发展新基石