双向链表插入删除基本操作演示
数据结构单链表插入、删除和修改实验报告

计算机学院实验报告课程名称:数据结构实验名称:单链表学生姓名:***学生学号:***********实验日期:2012一、实验目的1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。
2.掌握单链表中结点结构的C++描述。
3.熟练掌握单链表的插入、删除和查询算法的设计与C++实现。
二、实验内容1.编制一个演示单链表插入、删除、查找等操作的程序。
三、实验步骤1.需求分析本演示程序用C++6.0编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。
①输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。
在所有输入中,元素的值都是整数。
②输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。
其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。
④测试数据:A.插入操作中依次输入11,12,13,14,15,16,生成一个单链表B.查找操作中依次输入12,15,22返回这3个元素在单链表中的位置C.删除操作中依次输入2,5,删除位于2和5的元素2.概要设计1)为了实现上述程序功能,需要定义单链表的抽象数据类型:(1)insert初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。
(2)decelt操作结果:删除已有的单链表的某些结点。
(3)display操作结果:将上述输入的元素进行排列显示。
(4)modify操作结果:将上述输入的某些元素进行修改。
(5)save操作结果:对上述所有元素进行保存。
(6)load操作结果:对上述元素进行重新装载。
3.使用说明程序执行后显示======================1.单链表的创建2.单链表的显示3.单链表的长度4.取第i个位置的元素5.修改第i个位置的元素6.插入元素到单链表里7.删除单链表里的元素8.合并两个单链表9.退出系统=======================5.源代码:#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n){ LinkList p;L=new LNode;L->next=NULL;LinkList q=L;for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e){ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error;e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) { LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; }if(!p||j>i-1)return error;LinkList s=new LNode;s->data=e;s->next=p->next;p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e){ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){p=p->next;++j; }if(!(p->next)||j>i-1) return error;q=p->next;p->next=q->next;e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L){ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i){ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L){ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing(){ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main(){ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}6.测试结果四、实验总结(结果分析和体会)单链表的最后一个元素的next为null ,所以,一旦遍历到末尾结点就不能再重新开始;而循环链表的最后一个元素的next为第一个元素地址,可返回头结点进行重新遍历和查找。
数据结构C语言单链表上实现插入和删除的算法实验报告

一、实验目的1.掌握单链表的基本操作:插入、删除、查找以及表的合并等运算。
2.掌握运用C语言上机调试单链表的基本方法。
二、实验任务1.试编写在单链表上实现插入和删除的算法。
三、程序流程图四、测试过程及结果五、总结1.程序特点:最小化、模块化、for循环。
2.单链表特点:动态分配内存、必须从已知指针逐一查找数据、通过改变数据间的链接改变顺序。
附录程序清单#include <stdio.h>#include <stdlib.h>struct NODE{int data;NODE *next;};NODE *creatlink(){NODE *head,*p,*s;int i,n;head=(NODE *)malloc(sizeof(NODE));p=head;scanf("%d",&n);for(i=0;i<n;i++){s=(NODE *)malloc(sizeof(NODE));scanf("%d",&s->data);p->next=s;p=s;}p->next=0;return head;}void print(NODE *p){for(p=p->next;p!=0;p=p->next)printf("%d ",p->data);printf("\n");}void insert(NODE *p,int i,int x){NODE *s;int j;for(j=1;j<i;j++)p=p->next;s=(NODE *)malloc(sizeof(NODE));s->data=x;s->next=p->next;p->next=s;}void Delete(NODE *p,int i){NODE *s;int j;for(j=1;j<i;j++)p=p->next;s=p->next;p->next=s->next;free(s);}void main(){int i,x;NODE A=*creatlink();scanf("%d%d",&i,&x);insert(&A,i,x);print(&A);scanf("%d",&i);Delete(&A,i);print(&A);}。
10年《数据结构》课程设计参考题

10年《数据结构》课程设计参考题数据结构课程设计要求2.学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况。
3.课程设计完成要求运行界面友好(有菜单)、操作方便、输出结果正确、可读性强,每种操作有验证性输出。
4.按规定时间提交课程设计报告,过期计为0分。
课程设计实习报告封面的书写格式课程设计课程:数据结构题目:专业班级:姓名:学号:设计时间:指导教师:课程设计报告的内容一、设计题目二、运行环境(软、硬件环境)三、算法设计的思想四、算法的流程图五、算法设计分析六、源代码七、运行结果分析八、收获及体会课程设计题一:排序算法比较一、设计目的1.掌握各种排序的基本思想。
2.掌握各种排序方法的算法实现。
3.掌握各种排序方法的优劣分析及花费的时间的计算。
4.掌握各种排序方法所适应的不同场合。
二、设计内容和要求利用随机函数产生3000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。
--------------------------------------课程设计题二:图的深度周游一、设计目的1.掌握图的邻接表存贮结构。
2.掌握堆栈的基本运算实现。
3.掌握图的邻接表的算法实现。
4.掌握图的深度优先搜索周游算法实现。
二、设计内容和要求对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用堆栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现图的深度优先搜索周游。
--------------------------------------课程设计题三:图的广度周游一、设计目的1.掌握图的邻接表存贮结构。
2.掌握队列的基本运算实现。
3.掌握图的邻接表的算法实现。
4.掌握图的广度优先搜索周游算法实现。
二、设计内容和要求对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)实现图的广度优先搜索周游。
2.1.1《数据存储的顺序结构》-教学设计-粤教版(2019)高中信息技术-数据与数据结构选修1

- 设计一个综合性的编程任务,要求学生结合顺序存储结构的知识,解决实际问题。
- 引导学生思考如何优化数据存储结构,提升数据处理效率,培养逻辑思维和数据分析素养。
7. 总结与反馈(5分钟)
- 教师对本节课的重点内容进行回顾总结,强调顺序存储结构在实际应用中的重要性。
重点难点及解决办法
本节课的重点在于理解顺序存储结构的概念、特点及其应用场景,难点在于掌握链表结构的操作原理和实际编程实现。
重点解决办法:通过讲解和示例相结合的方式,直观展示顺序存储结构(如数组)的存储原理和操作方法,结合实际案例进行分析,使学生深刻理解其优势和适用场景。
难点突破策略:针对链表这一难点,采用逐步引导和分解的方法,从单链表的建立、插入、删除等基本操作入手,逐步过渡到双向链表和循环链表。通过动画演示、实物模型和编程实践等多种教学手段,帮助学生形象理解链表的抽象概念和操作过程。同时,设计相应的课堂练习和课后作业,巩固学生对链表知识点的掌握,提高其解决实际问题的能力。
4. 课堂提问(5分钟)
- 针对本节课的重点内容,提问学生,检验学生对顺序存储结构的理解和掌握程度。
- 鼓励学生提出疑问,教师现场解答,解决学生在学习过程中遇到的问题。
5. 创新教学互动(5分钟)
- 角色扮演:让学生模拟数据存储和检索过程,增强课堂趣味性和参与度。
- 实践操作:让学生在计算机上尝试编写简单的链表程序,提高动手能力。
学具准备
多媒体
课型
新授课
教法学法
讲授法
课时
第一课时
步骤
师生互动设计
二次备课
教学方法与策略
本节课采用讲授与互动相结合的教学方法。1.首先,通过讲授法向学生介绍顺序存储结构的基本概念和原理,确保学生掌握理论知识。2.接着,设计小组讨论和案例研究环节,让学生针对特定问题进行探讨,激发学生的思考与互动。3.此外,结合项目导向学习法,设计一个与顺序存储结构相关的编程项目,让学生在实践过程中加深理解。4.教学活动中,设计角色扮演游戏,让学生模拟数据存储过程,增加课堂趣味性。5.使用实验法,让学生通过编程软件进行链表操作实验,提高动手能力。教学媒体方面,运用多媒体课件、动画演示和编程环境等,辅助教学,提高课堂效果。
redistemplate操作list类型移除元素的方法

redistemplate操作list类型移除元素的方法全文共四篇示例,供读者参考第一篇示例:在开发中,我们经常会使用redis作为缓存数据库来提高系统性能和减少数据库压力。
在redis中,list是一种常用的数据结构,可以用来存储一系列的有序元素。
在实际应用中,经常会出现需要对list中的元素进行添加或移除的情况。
本文将介绍在redis中如何使用redistemplate操作list类型移除元素的方法。
1. 使用lrem方法:lrem方法是redis中提供的一个用来移除list中元素的方法。
其语法为:lrem key count valuekey表示要操作的list的key,count表示要移除的元素个数,value表示要移除的元素的值。
count参数的取值分为三种情况:- count>0:移除最多count个与value相等的元素。
- count<0:移除最多|count|个与value相等的元素,但是是从尾部开始移除。
- count=0:移除所有与value相等的元素。
2. 使用ltrim方法:ltrim方法是redis中提供的用来修剪list中元素的方法。
其语法为:ltrim key start stopkey表示要操作的list的key,start表示要保留元素的起始位置,stop表示要保留元素的结束位置。
执行ltrim命令后,redis会将list 中的元素保留在[start, stop]的范围内,其余的元素会被移除。
3. 使用redistemplate操作list类型移除元素的示例:下面给出一个使用redistemplate操作list类型移除元素的示例代码:```java@Autowiredprivate RedisTemplate<String, String> redisTemplate;public void removeElementFromList(String key, String value) {ListOperations<String, String> listOps = redisTemplate.opsForList();Long removedCount = listOps.remove(key, 0, value);System.out.println("Removed count: " + removedCount);}```在上面的代码中,我们首先通过@AutoWired注解注入了一个RedisTemplate对象,然后使用opsForList方法获取到ListOperations对象。
java中查询list中大于但最接近某个值的方法-概述说明以及解释

java中查询list中大于但最接近某个值的方法-概述说明以及解释1.引言1.1 概述在Java开发中,经常会遇到需要查询一个List中大于但最接近某个值的情况。
这个查询需求可能会在很多场景下出现,例如在排序算法中,或者在需要找到离某个目标值最近的元素时。
本文将介绍如何在Java中查询List中大于但最接近某个值的方法。
我们将探讨两种常用的方法:线性搜索和二分查找。
通过这些方法,我们可以根据自己的需求快速准确地定位到List中大于但最接近某个值的元素,为我们的开发工作提供便利。
在接下来的篇章中,我们将首先简要介绍List数据结构的特点和用途,为读者提供必要的背景知识。
然后,我们将深入研究两种查询方法,并分析它们的优缺点。
最后,我们将总结这些方法的适用场景,并展望它们在更广泛的应用中的潜力。
希望本文能为读者提供一个清晰的指导,帮助他们在Java中高效地查询List中大于但最接近某个值的方法。
无论是初学者还是有经验的开发者,我们相信本文都能对他们的工作有所启发和帮助。
让我们开始这个有趣而富有挑战的旅程吧!1.2 文章结构本文分为三个部分:引言、正文和结论。
- 引言部分介绍了本文的概述、结构和目的。
首先,概述部分简要介绍了本文的主题——在Java中查询List中大于但最接近某个值的方法。
其次,文章结构部分描述了本文的目录结构,方便读者了解全文内容的组织和展示方式。
最后,目的部分说明了本文的目标是通过详细介绍List数据结构和查询方法,并总结应用与展望,帮助读者在实际开发中更好地应用和拓展这些方法。
- 正文部分主要包括两个部分:List数据结构简介和查询List中大于但最接近某个值的方法。
首先,List数据结构简介部分将介绍List的基本概念及其在Java中的应用场景,为后续的查询方法提供基础知识。
然后,查询List中大于但最接近某个值的方法部分将详细介绍几种常用的实现方法,并通过具体的示例代码和步骤说明,帮助读者理解和实践这些方法。
java完整课件

Java语言的历史与发展
01
介绍Java语言的起源、发展历程以及在不同领域的应用。
Java语言的特点
02
详细阐述Java语言的跨平台性、面向对象、安全性等特点。
Java与C的对比
03
分析Java与C在语法、编程范式、内存管理等方面的异同点。
4
开发环境搭建
2024/1/26
JDK的安装与配置
集合框架中的常用接口和类
Java集合框架中常用的接口包括Collection、List、Set和Map,常 用的实现类包括ArrayList、LinkedList、HashSet、TreeSet和 HashMap等。
24
List接口及其实现类
2024/1/26
01
List接口的定义和特点
List接口是Java集合框架中的一个重要接口,它表示一种 有序的集合,可以包含重复元素。List接口提供了丰富的 操作方法来管理元素,如添加、删除、获取和遍历等。
字节流与字符流
学习使用字节流和字符流进行文件的读写操作,理解其使用场景和区 别。
缓冲流
掌握缓冲流的使用,理解其在提高文件读写效率方面的作用。
对象序列化与反序列化
了解对象序列化和反序列化的概念,学习使用ObjectOutputStream 和ObjectInputStream进行对象的写入和读取。
20
Runnable接口是Java中另一种实现多线程编程的方式,它定义了一个run()方法,用于指定线程要执行的任务。实现 Runnable接口的类可以创建多个实例,并且每个实例都可以作为一个独立的线程运行。
Thread类与Runnable接口的比较
Thread类和Runnable接口都可以实现多线程编程,但它们的使用方式和适用场景略有不同。Thread类 适合于简单的多线程任务,而Runnable接口更适合于复杂的、需要共享资源的多线程任务。
PowerPoint 演示文稿 天津科技大学.ppt

2020/4/25
第二章 线性表
8
2.2 线性表的顺序存储结构
1 顺序表
把线性表的结点按逻辑顺序依次存放在一组地址
连续的存储单元里。用这种方法存储的线性表简称顺序 表。
假设线性表的每个元素需占用l个存储单元,并以
所占的第一个单元的存储地址作为数据元素的存储位置。
则线性表中第I+1个数据元素的存储位置LOC( a i+1)和第 i个数据元素的存储位置LOC(a I )之间满足下列关系:
LOC(a i+1)=LOC(a i)+l
线性表的第i个数据元素ai的存储位置为:
线性表是一种典型的线性结构。
2020/4/25
第二章 线性表
4
含有n个元素的线性表是一个数据结构
Linear_list=(D,R) 其中 D={ai | ai D0 , i=1,2, ,n, n0}
R={N}, N={< ai-1 , ai> | ai-1 , ai D0 , i=2,3, ,n} D0为某个数据对象(可为任何数据类型) 对应的逻辑图如下:
变成长度为n+1的线性表 (a1,…a i-1,x,ai,…,an)
算法如下 Void InsertList(Sqlist*L,DataType x,int I)
{
int j;
if(I<1 || I>l.length+1)
printf(“Position error”);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a
b
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; ① } p
a
b
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; } p
①
s
e
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; } ②
a
b ②
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; ① }
① ③
s
e
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; } ② ④
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; }
s
e
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; }
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; ④ p->prior=s; a b return OK; }
s
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; }
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; }
① ③
s
e
在双向链表中插入结点
Status ListInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; } ② ④
tInsert_Dul(DuLinklist &L,int i,ElemType e) { if(!(p=GetElem_DuL(L,i))) return ERROR; if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR; s->data=e; ① s->prior=p->prior; ② p->prior->next=s; ③ s->next=p; p ④ p->prior=s; a b return OK; } ②
a ②
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; } ① c a ②
a
b
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; ① } p
① ③
s
e
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; }
a
b
c
在双向链表中删除结点
Status ListDelete_Dul(DuLinklist &L,int i,ElemType &e) { if(!(p=GetElem_DuL(L,i))) return ERROR; e=p->data; ① p->prior->next=p->next ; ② p->next->prior=p->prior; ③ free(p); return OK; } p