《华中科技大学数据结构实验4基于邻接表的图实现.docx》由会员分享,可在线阅读,更多相关《华中科技大学数据结构实验4基于邻接表的图实现.docx(143页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、等中利技火掌课程实验报告课程名称:数据结构实验专业班级:计算机科学与技术学号:U201414596姓名:卢振兴指导教师:周时阳报告日期:2016年12月8日.计算机科学与技术学院目录4基于邻接表的图实现14. 1实验目的14.2 程序设计概要14.3 系统测试与结果84.4 实验小结21参考文献22附录A顺序表实现程序清单23附录B链表实现程序清单43附录C二叉树实现程序清单66附录D基于邻接表的图实现程序清单1074基于邻接表的图实现4. 1实验目的通过实验加深对图的概念以及图的基本运算的理解;与此同时,熟练掌握图的逻辑结构与物理结构的关系,并以邻接表作为物理结构实现图的基本运算。4.2程序
2、设计概要4.2.1 设计目标本实验旨在设计一个基于邻接表的有向图和有向网的管理系统。本演示系统提供的操作包括:图的新建、图的销毁、顶点位置信息的确定、找到某顶点的第一个邻接顶点、找到某顶点一邻接顶点的下一顶点、对顶点进行赋值、获取顶点的值、新增一个顶点、删除一个顶点、插入一条邻边、删除一条邻边、对图进行深度优先遍历、对图进行广度优先遍历。本系统在程序进行时可实现消息处理,其中包括数据的输入和输出以及程序的退出。4.2.2 有关常量、类型、结构体以及函数的定义常量包括函数的返回状态和数据元素类型。函数的返回状态包括正确、错误、可行、运行非法、不可实行和溢出;数据的元素类型包括函数的返回类型Sta
3、tus,以及所用到的弧的信息参数类型InfoType。其中MAX_CHAR用于限定顶点名称的最大字符数,MAX_VERTEX_NUM用于限定图中的顶点数目。GraphKind用于定义图的类型。# define TRUE 1# define FALSE 0# define OK 1# define ERROR 0# define INFEASTABLE -1# define OVERFLOW -2typedef int Status;typedef int InfoType;typedef enum DG, DN GraphKind# define MAX_CHAR 3# define MAX_
4、VERTEX_NUM 20实验定义了多个结构体,其中包括用于储存图的结构ALGmph,用于储存顶点的结构VNode以及用于储存弧的结构ArcNodeotypedef struct VertexType char keyMAX_CHAR;int value;int islnit;);typedef struct ArcNode int adjvex;该弧所指向的顶点的位置struct ArcNode *nextarc;指向下一条弧的指针InfoType *info;该弧相关信息的指针typedef struct VNode VertexType data;顶点信息ArcNode *firstar
5、c;指向第一条依附该顶点的弧的指针 VNode, AdjListMAX_VERTEX_NUM;typedef struct AdjList vertices;int vexnum, arcnum;int kind;/图的当前顶点数和弧数/图的种类标志JALGraph;系统能够新建一个图、销毁一个图;确定一个顶点的位置、确定一个顶点的首个邻接顶点、确定一个顶点中某个邻接顶点的下一个邻接顶点;给一个顶点赋值,获得一个顶点的值;插入一个顶点,删除一个顶点;插入一条弧,删除一条弧;对图进行深度优先遍历;对图进行广度优先遍历。(1) CreateCraph(&G,V,VR)初始条件:V是图的顶点集,VR
6、是图的关系集。操作结果:按V和VR的定义构造图G。(2) DestroyCraph(&G)初始条件:图G存在。操作结果:销毁图G。(3) LocateVex(Gu)初始条件:图G存在,u和G中的顶点具有相同特征。操作结果:若u在图G中存在,返回顶点u的位置信息,否则返回其它信息。(4) GetVex (G,v)初始条件:图G存在,v是G中的某个顶点操作结果:返回v的值(5) PutVex (G,v,value)初始条件:初始条件是图G存在,v是G中的某个顶点操作结果:对v赋值value(6) FirstAdjVex(&G, v)初始条件:图G存在,v是G的一个顶点。操作结果:返回v的第一个邻接
7、顶点,如果v没有邻接顶点,返回空。(7) NextAdjVex(&G, v, w)初始条件:图G存在,v是G的一个顶点,w是v的邻接顶点。操作结果:返回V的(相对于W)下一个邻接顶点,如果W是最后一个邻接顶点,返回空。(8) InsertVex(&G,v)初始条件:图G存在,v和G中的顶点具有相同特征。操作结果:在图G中增加新顶点V。(9) DeleteVex(&G,v)初始条件:图G存在,v是G的一个顶点。操作结果:在图G中删除顶点v和与v相关的弧。(10) InsertArc(&G,v,w)初始条件:图G存在,v、w是G的顶点。操作结果:在图G中增加弧v,w,如果图G是无向图,还需要增加w
8、,v。(11) DeleteArc(&G,v,w)初始条件:图G存在,v、w是G的顶点。操作结果:在图G中删除弧v,w,如果图G是无向图,还需要删除w,v。(12) DFSTraverse(Gvisit()初始条件:图G存在。操作结果:对图G进行深度优先搜索遍历,依次对图中的每一个顶点使用函数visit访问一次,且仅访问一次。(13) BFSTraverse(GvisitO)初始条件:图G存在。操作结果:对图G进行广度优先搜索遍历,依次对图中的每一个顶点使用函数visit访问一次,且仅访问一次。1.1.3 数据结构的设计以及函数的设计(1)数据结构的设计在4.2.2结中定义的函数均属于对图的操
9、作;图是基于邻接表的,邻接表由表头结点和表结点两部分组成,其中每个顶点都对应着图结构的数组中的一个表头结点。有向图的邻接表的存储结构如图4.1所示。有向网的邻接表存储结构如图4.2所示。a graph .and its adjacency list:图4.1有向图的邻接表存储结构dafa adj dost cost link dest cost link图4.2有向网的邻接表存储结构(2)函数的设计关于图的函数可以分为三大类:构造类函数,其中包括图的构造、图的销毁、添加顶点、删除顶点、插入邻边、删除邻边。查询类函数,包括对顶点的查询、对顶点最近邻接顶点的查询、对顶点邻接顶点中某顶点的下一个顶点
10、进行查询、对顶点的值进行查询(首先需要赋值)。遍历函数,其中包括图的深度优先遍历和图的广度优先遍历。a)构造类函数构造类函数即是实现对图的构造和销毁,并实现对顶点和邻边的插入和删除操作。构造图时,第步:输入图的基本信息,其中包括图的类型(有向图或有向网)、图的顶点数、图的边数;第步:输入图的顶点的key,在图的结构体中构造顶点的线性表;与此同时,对每个顶点的邻接边指针进行置空。第步:构造表的结点链表,将新输入的邻边结点插入头部。如图4.3所示。图4.3将新的邻边插入头部销毁图时,首先将图的结点数和边数都置0,再对线性表中的每个顶点所连接的邻边进行遍历,并一一释放各条弧的存储空间。如果是网,还需
11、要释放掉权值的存储空间。插入顶点,在G所在结构的vertices数组的末尾插入新的结点即可。插入顶点时,不插入相关的邻边,相关邻边的插入交给InsertArcO。与此同时,对图结构的vexnum加1。删除顶点时,首先遍历以该顶点为出度的邻边,并一一释放存储空间。释放完成后,再遍历存储顶点的线性表,找到所有以该顶点为出度的邻边,并对其进行释放。释放的同时,将该邻边的前驱和后继相连。与此同时,对图结构的vexnum 减lo插入邻边时,首先获取所输入的两个顶点的位置,并判断两点间是否已经存在邻边。若存在,则返回不可执行。若不存在,则在出度点的fristarc上插入含入度点的相关信息的弧。与此同时,对
12、图结构的arcnum加1。删除邻边时,首先查找是否存在这样的邻边,若不存在,返回INFEASIBLEo 若存在,则遍历弧的出度顶点所连接的邻边,当找到弧后,连接弧的前驱和后继,并释放这条弧的存储空间。与此同时,对图结构的arcnum减1。b)查询类函数查询类函数,即包括对顶点的查询、对顶点最近邻接顶点的查询、对顶点邻接顶点中某顶点的下一个顶点进行查询、对顶点的值进行查询(首先需要赋值)。对顶点进行查询,即是遍历图结构体存放顶点的线性表,找到顶点的位置,并返回位置序数。对顶点最近邻接顶点的查询即返回该顶点结点中fristarc所指向结点所对应的 adjvex 值。对顶点邻接顶点中某顶点X的下一个
13、顶点进行查询,即是遍历顶点所连的邻边链表,找到顶点X,并返回X后继所对应的adjvex值。对顶点进行赋值,找到该顶点,给顶点结点中的data.vaMe赋值即可。获取顶点的值,找到该顶点,获取该顶点的值即可。c)遍历类函数遍历类函数包括深度优先遍历和广度优先遍历。其中深度优先遍历:访问初始结点v,并对v进行已访问的标记(visited (v)= TRUE)查找v的第一个邻接结点wo若w存在,则执行,否则结束遍历。若w未被访问,则对w进行深度优先遍历(执行步骤)查找w的下一个邻接结点,并从开始执行。广度优先遍历需要运到队列作为辅助,其相关算法可以表述为:访问初始结点v,并对v进行已访问的标记。将结
14、点v送入队列。若队列已空,则结束算法,队列非空则继续。出队列,取得头结点u。查询u的第一个邻接结点w。若w不存在,则转到;若w存在则执行:a)若w未被访问,则访问 w并标记w; b)让结点w入队;c)查找结点u在w之后的下一个邻接结点wl,转入步骤。1.1.4 复杂性分析在操作邻接表时,所用的时间复杂度和顶点数n与边长e有关,各个函数的时间复杂度如表所示。表4基于邻接表的图功能函数时间复杂度函数时间复杂度函数时间复杂度CreateGraphO(n+e)InsertVex0(1)DestroyGraphO(n+e)Delete VexO(n+e)LocateVex0(n)InsertArc0(n
15、+e)GetVex0(n)DeleteArc0(n+e)PutVex0(n)DFSTraverse0(n+e)First Adj vex0(n)BFSTraverse0(n+e)Next Adj VexO(n+e)4.3 系统测试与结果系统的测试主要检查系统是否能够不报错地正常运行;图的各项操作是否正确,包括创建图、销毁图、确定某顶点位置、遍历图等等;图是否具有容错性;比如,在图未初始化时,进行插入元素操作能够提示“图尚未创建”(1)对初始状态的容错性进行测试测试系统的容错性,看在图未创建时,调用功能函数的提示是否正常。理论值应当提示“图还未创建,请先创建图”。相关用例与结果如表4.2所示。表
16、4.2初始状态容错性测试测试用例程序输入实验结果用例1输入请选择你的操作013:2图还没有匐建,请先创建图!(按任意键继续)用例2输入3请选择你的操作0-13:3图还没有颔建,请先创建图!(按任意键继续)输入5用例3请选富魄慧望,1畿创建图!(按任意键继续)用例4输入7加选富飕髓1露创建图!(按任意键继续)用例5输入10请选择你的提件1到口上图还没有初建,请先创建图!(按任意键继续)用例6输入请选择你的操作013:13图还没有胡建,请先创建图!(按任意键继续)(2)对图的创建和图的遍历的测试创建一个图,并对其进行遍历,看遍历结果是否符合理论结果。所创建的图,如图所示图4.4实验用例中创建的图按
17、照上图所示,输入图的各项数据,包括顶点数、边数、顶点信息、弧的信息。创建成功,如图所示。前人一差:数】A请输入瓠头(字符串):E南籍越鹦麟key (总数不超过20)请输入第1个顶点的key :A请输入第2个顶点的key:B请输入第3个顶点的key:C请输入第4个顶点的key:D请输入第5个顶点的key:E请输入第6个顶点的key:F、聚手簿备零驾馨参数】 请输入装尾(子将串):A请输入头(字符串):早藕绊辎参数】 请输入奥尾(子将串):A请输入弧头(字符串):BB请输入弧头(字符串):孝甲翳4军黯参数】 请输入弧尾(子符串):B请输入弧头(字符串):F、以耳警备献参数】 请输入弧尾(子符器):
18、D请输入弧头(字符串):F请输入瓠尾(字符串了:B请输入弧头(字符串):D晶飕第皤攀】E请输入弧头(字符串):整人弧头(字符串):整人弧头导符串):请输入弧头(字符串): 成功创建图!(按任意键继续)请选择你的操隹法输入图曲类型(0,有向图;1.有向网;):0请输入图的顶点数:6请输入图的边数:9图4.5实验创建图的结果分别对图进行深度优先遍历和广度优先遍历,遍历结果如表4.3所示。表4.3对创建图进行的深度优先遍历和广度优先遍历测试用例程序输入理论结果实验结果请选增修攀作。13:12I耀舞爵霸蕊(按任意键继续)请选挂你的操作0:13琏翔第2个缠电力:C题1褊(按任意键继续)(3)对图的查询功
19、能进行测试查询功能包括对顶点的查询、对顶点最近邻接顶点的查询、对顶点邻接顶点中某顶点的下一个顶点进行查询、对顶点的值进行查询(首先需要赋值),相关用例与测试结果,如表4.4所示。表4.4对图查询功能进行测试的用例与结果测试用例程序输入理论结果实验结果用例1输入3再输入C显示位于邻接表的第三个请选择你的黑隹。13:3请输入称想着找的顶点的key (string):C该节点位于邻接表的第3个,其标记为2(按任意键继续)用例2输入6再输入A显示邻接结点为B请选接你的濠作0闻:6请输入称油、查找的顶点的key(string):A 顶点A的邻接结点为B(按任意键继续)用例3输入7;输入A再输入B显示邻接
20、结点为C请选择你的操隹013:7再输入徐卷查找的顶点的key(string):A请输入与该顶点相逢的一个顶点的key(string):B所查询的结点的key为C(按任意键继续)用例4输入7;输入A再输入C显不邻接结点为请选择你的操作法输入称想查找的顶点的key (string):A 请输入与修顶点相隹的一个顶点的keylstring):C所查询的结点的key为E(按任意键继续)用例5输入5:输入B再输入1995成功为B赋值1995请选择你的操作013:5请输入你想赋值的顶点的key(string):B 请输入称想赋何值:1995赋值成功!顶点B的值为1995。(按任意键继续)用例6输入4再输入
21、B输出B的值为1995请选择你的操作DT网:4请输入森愚查找的顶点的key(string):B顶点B的值为1995(按任意键继续)(4)对插入和删除功能的测试在图中插入一个顶点G,并将G与原图作如下方式连接。图4.6插入一个顶点后的图模型首先进行插入相关的测试,插入结点G,以及邻边G-E和F-Go相关插入用例如表4.5所示表4.5插入结点G的相关用例测试用例程序输入理论结果实验结果用例1输入8再输入C成功插入结点G请选择你的操作013:8请输入称想插入顶点的key(string):G成功插入结点G(按任意键继续)用例2输入10,再输入G,E成功插入邻边G-E请选择你的操作0-:10*慈入修瓶假
22、入更取星期电更key (string):G 请输入祢想招人边的卖顶点的key(string):E成功在G和E间插入弧(按任意键继续)用例3输入10,再输入F,G成功插入邻边1G清是鹳费噩思娜顶螂ey(string):F 请输入祢瘤槽入边的卖质点的keylstringi :G成功在F和G间插入弧(按任意键继续)在插入G后,对插入后的图进行遍历。看插入后的图是否正常。相关用例如表4.6所示。表4.6对插入G后的图进行遍历测试用例程序输入理论结果实验结果请选辑噢避13:12薪热第6小结点为:E 第汴结点为:C(按任意键继续)请选辑噢辘、013:13i疆融第61结点为:G(按任意键继续)接着,对邻边和
23、顶点进行删除操作,使得图恢复到插入G前的状态。删除操作的用例如表4.7所示。表4.7对结点G及相关邻边进行删除操作的用例测试用例程序输入理论结果实验结果用例1输入,11,;输入,G、E成功删除邻边G-E请选择你的操作德输入福跚除弧的弧尾的key (string):G 请输入祢想蒯除班的就买的key (string):E成功删除在G和E间的弧(按任意键继续)用例2输入11:输入FG成功删除邻边F-G请选择你的操作道输入徐迪厕际瓠的弛尾的key (string):F 请输入族想删像我的黄实的keylstringS:G成功删除在F和G间的弧(按任意键继续)用例3输入9;输入*G成功删除顶点请选择你的
24、操作013:9法输入称想蒯除的顶点的key (string ):G成功删除结点G(按任意键继续)对删除顶点G后的图再次进行遍历,以确定删除过程中没有出现问题。删除用例如表4.8所示。表4.8删除顶点G后对图进行遍历的测试用例及结果测试用例程序输入理论结果实验结果用例1输入遍历序列为ABDFCE请选髻佟攀作013:12塞妗绐部):F第6个结点为:E(按任意键继续)用例2输入13,遍历序列为ABCEDF雌学便磐作0:13塞斗暮翥:B(按任意键继续)(4)对图的销毁进行测试对图的销毁进行测试,确保图能够被正常的销毁,销毁后选用其他功能时应提示“图还没有创建”。相关用例如表4.9所示。表4.9销毁图的
25、用例与结果测试用例程序输入理论结果实验结果用例1输入2成功销毁图请选择你的操作0-13:2(按任意键继续)用例2输入3,提示图尚未创建请以函而操作0闾:3图还没有胡建,请先创建图!(按任意键继续)除上述功能外,该系统还支持对有向网进行操作;基本操作与有向图相同,唯一不同的是,在创建时需要输入权值。创建如图4.7所示的有向网。图4.7实验用例有向网对上图所示的有向网进行创建,分别输入图的基本信息、弧尾弧头以及权值等信息。创建过程如图4.8所示。清选鞅出髓船3号有向困:1,有向网;):谓输入图的顶点数:4请输入图的边数:愿麒居喘隘Ik”(总数不超过20)请输入第1个顶点的key:请输入第W顶点的k
26、ey:B清输入第3个顶点的key:C请输入第4个顶点的key:D请输入弧头(字符串):B请输入权值(int):2蓦鞭蒙献参数】请输入5c尾(子符串):c请输入弧头(字符串):D请输入权值(int):12【下面抽入第矽弊的参数】请输关或尾(字确):D请输入弧头(字符串):请输入权值(int):8成功创建图!(按任意键继续)请输入菰头(字符串):C请输入权值(int):3请输入弧头(字符串):D请输入权值(int):5图4.8创建网的过程对有向网进行深度优先遍历和广度优先遍历,确认创建无误,相关用例如表4.10所示表4.10对有向网进行遍历的用例与结果测试用例程序输入理论结果实验结果用例1输入*1
27、2*遍历序列为ACDB请选辑你赞隹013:12第4法结点为:B(按任意键继续)用例2输入13,遍历序列为ACBD请选.明簪过:1314霰勰塞2个维卓达:B第3小结点为:D(按任意键继续)4.4 实验小结通过本次实验,实验者对以邻接表为物理结构的图有了更深入的认识。特别的,实验者对图的构建与图的遍历有了更好的理解。在邻接表中,顶点是作为弧的头结点存放在线性表中的;而与顶点相连的弧则以链表的形式串在顶点所在的头结点上。利用这种储存形式,很容易求得顶点和边的各种信息。深度优先遍历运用到了递归的思想。首先访问结点v,接着以同样的方式访问结点V的邻接结点。从本质上而言,深度优先遍历类似于树的先序遍历。广
28、度优先遍历用到了队列作为辅助。先入先出式的遍历,从一点为中心,层层铺设开来。从本质上而言,广度优先遍历类似于树的层序遍历。参考文献1严蔚敏等.数据结构(C语言版).清华大学出版社2 Larry Nyhoff. ADTs, Data Structures, and Problem Solving with C+. Second Edition, Calvin College,20053殷立峰.Qt C+跨平台图形界面程序设计基础.清华大学出版社,2014:1921974严蔚敏等.数据结构题集(C语言版).清华大学出版社附录A顺序表实现程序清单#include #include #include
29、/*函数结果状态代码*/# define TRUE 1# define FALSE 0# define OK 1# define ERROR 0# define INFEASIBLE-1# define OVERFLOW -2/Status是函数的类型,其值是函数结果的状态代码typedef int Status;typedef int ElemType;数据元素类型定义typedef struct 顺序表(顺序结构)的定义ElemType * elem;int length;int listsize;SqList;# define LIST_INIT_SIZE 100# define LIS
30、TINCREMENT 10Status InitList(SqList &L);Status DestroyList(SqList &L);Status ClearList(SqList &L);Status ListEmpty(SqList L);int ListLength(SqList L);Status GetElem(SqList L, int i, ElemType & e);int LocateElem(SqList L, ElemType e, int mode);/*C 语言不允许嵌套函数定义*/Status PriorElem(SqList L, ElemType cur_
31、e, ElemType & pre_e);Status NextElem(SqList L, ElemType cur_e, ElemType & next_e);Status ListInsert(SqList & L, int i, ElemType e);Status ListDelete(SqList & L, int i, ElemType & e);Status ListTraverse(SqList L);Status SaveList(SqList L, char * filename);Status LoadList(SqList & L, char * filename);
32、ElemType e;/*compare 模块*/Status Equal(int a, int b);Status GreaterThan(int a, int b);Status SmallerThan(int a, int b);int main(void)SqList L;int operate =1;操作序号在0-12之间int e, seq, mode, result;/seq 表示序号数;mode 为关系 compare 的模式数;result返回结果;e用来代入函数获取结果。int k;int cur_e, pre_e, next_e;/ cur_e表示当前元素,pre_e表示
33、当前元素的前驱,next_e表示当前元素的后继。int islnitial =0;判断线性表是否存在 while (operate)system(nclsn);printf(nn);printf(欢迎使用顺序线性表菜单n);printf(n-n);printf(1. IntiaList7. LocateElemnM);printf(2. DestroyList8. PriorElemn);printf(n3. ClearList9. NextElem iT);printf(n4. ListEmpty10. Listlnsertn);printf(5. ListLengthll.ListDele
34、ten);printf(6. GetElem12. ListTrabversen);printf(Mprintf(n0. Exitnn);88.保存线性表99.加载线性表nn);printfCn);printf(请选择你的操作012/88,99:);scanf(%d”,&operate);switch (operate)case 1:/InitListif(InitList(L)= OK)(printf(nnt新建线性表成功!n); islnitial =1;)else(printf(”nt新建线性表失败!n“);getchar();printf(”ntt (按任意键继续)n);getchar
35、();break;case 2:/DestroyListif(!islnitial)printf(nt 线性表不存在!”);else(if (DestroyList(L)= OK)(printf(nt删除线性表成功!n”);islnitial =0;)elseprimf(”nt删除线性表失败!n);)getchar();printf(”ntt (按任意键继续)n);getchar();break;case 3:/ClearListif(!islnitial)printf(nt 线性表不存在!);elseif(ClearList(L)= OK)printf(nt 清空线性表成功!n”);else
36、 printf(nt清空线性表失败!nn);getchar();printf(ntt (按任意键继续)n);getchar();break;case 4:/ListEmptyif (!islnitial)printf(”nt 线性表不存在!);else(if(ListEmpty(L)= TRUE)printf(nnt 该线性表是空的!n”);else printf(nt 该线性表非空!n);)getchar();printf(ntt (按任意键继续)n);getchar();break;case 5:/listLenthif(!islnitial)printf(nt 线性表不存在!”);els
37、e(printf(nt 该线性表的长度为:dn”, ListLength(L);)getchar();printf(ntt (按任意键继续)nu);getcharO;break;case 6:/GetElemif(!islnitial)printf(nt 线性表不存在!);else(printf(nt请输入元素的序号scanf(%dn,&seq);if (result = GetElem(L, seq, e)!= ERROR)(printf(nt 第d 个数的数值为:%dn, seq, e);Ielse(printf(nt 查询失败n”);)getchar();printf(ntt (按任意键
38、继续)n);getchar();break;case 7:/LocateElemif (!islnitial)printf(nt 线性表不存在!);else(printf(nt请输入需要参与比较的数:);scanf(%dn,&e);的位置n);printf(nt请输入比较的模式nt输入T:找到第一个相等数printf(t输入2:找到第一个比该数小的数的位置nt输入3:找到第一个比该数大的数的位置n);printf(t输入其他数无效!输入:);scanf(%d,&mode);if (result = LocateElem(L, e, mode)!= ERROR)(if (result !=0)(
39、e, result);printf(nt与d满足关系的数据元素序号为:dn,else printf(nt这样的数据不存在!n);)else printf(nt 查询失败n);)getchar();printf(ntt (按任意键继续)n);getchar();break;8:/PriorElemif (!islnitial)printf(nt 线性表不存在!);else(printf(nt请输入你想要找的数据数值:);scanf(M%dn,&cur_e);if (PriorElem(L, cur_e, pre_e)= OK)printf(Mnt%d 的前驱是十,cur_e, pre_e);)e
40、lse( printf(nt 操作失败!n);)getchar();printf(ntt (按任意键继续)n);getchar();break;case 9:/NextElemif(!islnitial)printf(nnt 线性表不存在!”);else(printf(Mnt请输入你想要找的数据数值:); scanf(n%dn,&cur_e);if (NextElem(L, cur_e, next_e)= OK)(printf(nt%d 的后继是(1”,cur_e, next_e);elseprintf(nt 操作失败!nH);getchar();printf(ntt (按任意键继续)nH);
41、getchar();break;case 10:/Listinsert if(!islnitial)printf(nt 线性表不存在!); else (printf(nt请输入你想要插入的数据数值:); scanf(%d,&e);printf(nt请输入你想要插入数据数值的位置:); scanf(%d,&seq);if (ListInsert(L, seq, e)= OK)printf(nt插入成功,目前线性表中的数据为:n); printf(t);for (k =1; k = ListLength(L); k+)GetElem(L, k, e); printf(%d , e);) else printf(nt 插入失败!n);getchar();printf(ntt (按任意键继续)n);getchar();break;case 11:/ListDeleteif(!islnitial)printf(nt 线性表不存在!”);else(printf(nt请输入你想要删除数据的位置:);scanf(%d,&seq);if