《华中科技大学数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学数据结构实验报告.docx(123页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、律中科於夫掌课程实验报告课程名称:数据结构实验专业班级:学号:姓名:指导教师:报告日期:2015年11月20日计算机科学与技术学院目录1基于顺序存储结构实现线性表的基本运算11.1 问题描述11.2 顺序表演示系统设计31.2.1 系统总体设计31.2.2 有关常量和类型定义31.2.3 算法设计31.3 顺序表演示系统实现与测试81.3.1 系统实现81.3.2 系统测试181.4 实验小结202基于链式存储结构实现线性表的基本运算202.1 问题描述202.2 单链表演示系统设计212.2.1 系统总体设计212.2.3 算法设计222.3 单链表演示系统实现与测试242.3.1 系统实现
2、242.3.2 系统测试362.4 实验小结373基于顺序存储结构实现栈的基本运算382.5 1顺序栈实验383.1.1 问题描述383.1.2 顺序栈设计383.1.3 顺序栈实现与测试443.2表达式求值实验553.2.1 问题描述553.2.2 算法设计部分553.2.3 实现与测试部分563. 3实验小结574基于循环队列存储结构实现队列的基本运算584. 1问题描述585. 2队列基本操作算法设计:586. 3实验小结665基于二叉链表实现二叉树的基本运算677. 1实验内容与要求675.2程序概要设计675.3数据结构与算法设计685.4程序清单与测试705.5实验总结与评价836
3、基于邻接表实现图的基本运算846.1实验内容与要求846.2程序概要设计846.3数据结构与算法设计856.4程序清单与测试876.5实验总结与评价109参考文献1091基于顺序存储结构实现线性表的基本运算1.1问题描述叙述实验中线性表的物理结构形式,如何用物理结构表示数据元素间的逻辑关系,可用图的方式直观表示物理结构,如图1-1所示。图1-1顺序表物理结构示意图实验耍完成的顺序表算法:(1) InitaList(&L)操作结果:构造一个空的线性表。(2) DestroyList(&L)初始条件:线性表L已存在。操作结果:销毁线性表L。(3) ClearList(&L)初始条件:线性表L已存在
4、。操作结果:将L重置为空表。(4) ListEmpty(L)初始条件:线性表L已存在。操作结果:若L为空表,贝IJ返回TRUE,否则返回FALSE。(5) ListLength(L)初始条件:线性表已存在。操作结果:返回L中数据元素的个数。(6) GetElem(L, i,&e)初始条件:线性表已存在,IWiWListLength(L)。操作结果:用e返回L中第i个数据元素的值。(7) LocateElem(L, e, compare ()初始条件:线性表已存在。操作结果:返回L中第1个与e满足关系compare ()关系的数据元素的位序,若这样的数据元素不存在,则返回值为0。(8) Prio
5、rElem (L, cur_e,&pre_e)初始条件:线性表L已存在。操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。(9) NextElem (L, cur_e,&next_e)初始条件:线性表L已存在。操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。(10) ListInsert(&L,i,e)初始条件:线性表L已存在且非空,liListLength(L)+l。操作结果:在L的第i个位置之前插入新的数据元素e, L的长度加1(11) ListDelete(
6、&L,i,&e)初始条件:线性表L已存在且非空,IWiWListLength(L)。操作结果:删除L的第i个数据元素,用e返回其值,L的长度减1.(12) ListTraverse(L, visit ()初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数visit。一旦调用失败,则操作失败。(13) ReadList(&L)操作结果:读取线性表(14) SaveList(L)操作结果:保存线性表实验目标:构造成具有功能菜单的系统完成线性表基本操作。通过实验达到:(1)加深对线性表的概念、基本运算的理解:(2)熟练掌握线性表的逻辑结构与物理结构的关系;(3)物理结构采用顺序表,熟
7、练掌握线性表的基本运算的实现。1.2 顺序表演示系统设计1.2.1 系统总体设计系统的总体架构:界面上采用简易菜单,通过switch函数进行功能的选择,进入相关功能函数执行相关操作。1.2.2 有关常量和类型定义typedef int ElemType;/数据元素类型定义#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct顺序表(顺序结构)的定义ElemType * elem;int length;int listsize;SqList;1.2.3 算法设计(1) InitaList(&L)设计:分配存储空间,并将le
8、ngth值设为0, listsize值设为预定义的初始存储容量。复杂度:时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)(2) DestroyList(&L)设计:释放内存,并让ele指向NULL,表长及存储容量置为0。复杂度:时间复杂度T(n)=0(1)空间复杂度S(n)=0(1)(3) ClearList (&L)设计:将表长设为0。复杂度:时间复杂度T(n)= O(l)空间复杂度S(n)=0(1)(4) ListEmpty(L)设计:读取表长length的值,为0则返回TRUE,否则FALSE。复杂度:时间复杂度T(n)=0(1)空间复杂度S(n)= O(l)(5) List
9、Length(L)设计:返回L.length的值。复杂度:时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)(6) GetElem(L, i,&e)设计:将L.elemi-1的值赋给e,并返回OK复杂度:时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)(7) LocateElem(L, e, compare ()设计:遍历顺序表,将与给定元素e满足关系compare的元素的位序返回。复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(8) PriorElem (L, cur_e,&pre_e)设计:从头遍历,若当前节点后继值为cur_e,则将当前结点的元
10、素赋给pre_e, return OK。若未找至则返回FALSE。流程图如下所示:复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)4(9) NextElem (L, cur_e,&next_e)设计:从头遍历,若当前节点值为cur_e且非表尾,则将后继结点的元素赋给pre_e, return OK,若未找到,则返回FALSE。流程图如下:复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(10)ListInsert(&L,i,e)设计:先判断i值是否符合要求,不符返回ERROR。i值合法,则检查空间大小,若空间不够,增加存储容量。然后将插入位置及之后的元素
11、右移,最后插入e,表长加.流程图如下所示:复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(1 l)ListDelete(&L,i,&e)设计:先判断i值是否符合要求,不符返回ERROR。i值合法,则将被删除元素的值赋给e,然后将被删除元素之后的元素左移,最后表长减流程图如下所示:Y +找到删除位置&(L-Xlemi-1D;将被删除元素的值赋给e用循环将删除位置之后的元素前移复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(12)ListTraverse(L, visit ()设计:遍历顺序表,对每个元素调用函数指针visit所指向的函数,若调用失败则提
12、示操作失败。复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(13)ReadList(&L)设计:若原L已存在,销毁,新建,再要求用户输入读取文件名,然后使用fread 函数进行文件的读取。复杂度:时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(14)SaveList(L)设计:让用户输入所要保存到的文件名,然后使用fwrite函数将顺序表保存入文件中。复杂度:时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)1.3 顺序表演示系统实现与测试1-3.1系统实现编程环境:WIN 10下使用DevC+进行编译调试,语言选择C语言。各函数间调用关系:主函数
13、通过switch调用各功能函数,各函数间除ReadList调用 DestroyList和InitList外,各自相互独立。程序源代码:#include #include 函数结果状态代码# define TRUE 1# define FALSE 0# define OK 1# define ERROR 0# define INFEASTABLE-1# define OVERFLOW -2/Status是函数的类型,其值是函数结果状态代码typedef int Status;/数据元素类型定义typedef int ElemType;# define LISTJNIT_SIZE 100# def
14、ine LISTINCREMENT 10typedefstruct顺序表(顺序结构)的定义ElemType * elem;int length;int listsize;JSqList;Status 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
15、,ElemType e, Status (*compare)(ElemType a, ElemType b);Status PriorElem(SqList L,ElemType cur_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, S
16、tatus (*visit)(ElemType a);Status ReadList(SqList * L);Status SaveList(SqList L);Status Compare(ElemType a, ElemType b);Status Visit(ElemType a);/*# 函数名称:IntiaList# 输入参数:线性表L地址# 返回值:Status# 函数功能:构造一个空的线性表。# /Status InitList(SqList * L)L-elem =(ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType); if(
17、!L-elem)(exit(OVERFLOW);)L-length=O;L-listsize=LI STJN 1T_S IZE;return OK;* 函数名称:DestroyList* 输入参数:线性表L地址* 返回值:Status* 函数功能:构造一个空的线性表。* /Status DestroyList(SqList 函数名称:ListEmpty*输入参数:线性表L*返回值:Status*函数功能:若L为空表,则返回TRUE,否则返回FALSE。*/ L)(free(L-elem);L-elem = NULL;L-length=0;L-listsize=O;return OK;* 函数名
18、称:ClearList* 输入参数:线性表L地址* 返回值:Status* 函数功能:将L重置为空表。刊Status ClearList(SqList * L)(L-length =0;return OK;Status ListEmpty(SqList L)(if (L.length =0)(return TRUE;) else (return FALSE;* 函数名称:ListLength* 输入参数:线性表L* 返回值:Status* 函数功能:返回L中数据元素的个数。刊int ListLength(SqList L)(return L.length;*e = L.elemi-1;retu
19、rn OK;* 函数名称:LocateElem* 输入参数:线性表L,用于比较的元素e,指向用于比较的函数的函数指针compare* 返回值:ini* 函数功能:返回L中第1个与e满足关系compare ()关系的数据元素的* 位序,若这样的数据元素不存在,则返回值为0。为int LocateElem(SqList L,ElemType e, Status (*compare)(ElemType, ElemType)(int i;for (i =1; i = L.length; i+)(if (*compare)(L.elemi-l, e)return(i);)return 0;* 函数名称:
20、PriorEIem* 输入参数:线性表L,我的元素cur_e,用于返回其前驱的元素pre_e的地址* 返回值:Status* 函数功能:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。刊Status PriorElem(SqList L,ElemType cur_e,ElemType * pre_e)int i;for (i =0; i (L.length-1); i+)if(L.elemi+l= cur_e)(*pre_e = L.elemi; return OK;)return ERROR;* 函数名称:NextElem* 输入参数:线
21、性表L,查找的元素cur_e,用于返回其后继的元素nexl_e的地址*返回值:Status* 函数功能:若cuje是L的数据元素,且不是最后一个,则用next_e返回它* 的后继,否则操作失败,next_e无定义。*/Status NextElem(SqList L,ElemType cur_e,ElemType 函数名称:Listinsert*输入参数:线性表L地址,插入位置i,插入元素e*返回值:Status*函数功能:在L的第i个位置之前插入新的数据元素e, L的长度加1 next_e)(int i;for (i = O;i(L.length-l); i+)(if (L.elemi= c
22、ur_e)*next_e = L.elemi+1;return OK;)return ERROR;*/Status ListInsert(SqList 函数名称:ListDelete*输入参数:线性表L地址,删除位置i,用于返回其值的元素e的地址*返回值:Status L,int i,ElemType e)(if(i L-length+l)/i 值不合法(return ERROR;)if (L-length = L-listsize)当前存储空间已满,增加分配(L-listsize +ElemType * newbase;newbase =(ElemType *)realloc(L-elem,
23、 LISTINCREMENT)*sizeof(ElemType);if (! newbase)( exit(OVERFLOW);存储分配失败)L-elem = newbase;/新基址L-listsize += LISTINCREMENT;增力存储容量)ElemType * p,* q;q =&(L-elemi-l);/q 为插入位置for (p =&(L-elemL-length-1); p = q;p)(*(p+l)=*p;插入位置及之后的元素右移)*q = e;插入 e+L-length;表长增加1return OK;*函数功能:删除L的第i个数据元素,用e返回其值,L的长度减1.*/S
24、tatus ListDelete(SqList * L,int i,ElemType * e)(ElemType * p,* q;if (i L-length)/i 值不合法(return ERROR;)p =&(L-elemi-l):/p为被删元素位置*e =*p;被删除元素的值赋给eq = L-elem + L-length -1;/表尾元素的位置for (+p; p length;表长减1return OK;* 函数名称:ListTraverse* 输入参数:线性表L,指向调用函数的函数指针visit* 返回值:Status* 函数功能:依次对L的每个数据元素调用函数visit。* !S
25、tatus ListTraverse(SqList L, Status(*visit)(ElemType a)(int i;printf(nall elementsnn);for(i=0;ielemL-length), sizeof(ElemType),1, fp) L-length+;fclose(fp);return OK;* 函数名称:SaveList* 输入参数:线性表L* 返回值:Status* 函数功能:保存线性表。刊Status SaveList(SqList L)(FILE *fp;char filename30;printf(”请输入保存文件名:”);scanf(,%s,&f
26、ilename);写文件的方法if (fp = fopen(filename,w)= NULL)(printf(文件打开失败n ”);return ERROR;)fwrite(L.elem, sizeof(ElemType), L.length, fp);fclose(fp);return OK;* 函数名称:Compare* 输入参数:ElemType a, ElemType b* 返回值:Status* 函数功能:判断a, b是否满足关系列Status Compare(ElemType a, ElemType b)(if (a = b)return TRUE;)else(return FA
27、LSE;* 函数名称:Visit* 输入参数:ElemType a* 返回值:Status* 函数功能:输出a* /Status Visit(ElemType a)(printf(M%d ”,a);return OK;)1.3.2系统测试使用预先保存的测试用例挑选 LocateElem, NextElem, Listinsert, ListDelete ListTraverse 进行测试。使用的测试用例:Testi(表含5,12,0,44,94), Test2(空表)。(1) LocateElem 测试:表1.3.2-1 LocateElem算法测试用例表测试用例程序输入理论结果运行结果Tes
28、ti1 .主界面选择7进入函数2 .按提示输入所要比较的函数(本程序比较函数设为两数相等返回T RUE,故提示语为输入要搜寻的函数),输入12输出“第二个元素符合条件”.输出“第二个元素符合条件”,符合预期。1 .主界面选择7进入函数2 .输入100提示“未找到符合条件的元素”输出“未找到符合条件的元素”,符合预期。Test21 .主界面选择7进入函数2 .输入100提示“未找到符合条件的元素”输出“未找到符合条件的元素”,符合预期。无1.主界面选择7进入函数提示“线性表不存输出“线性表不存在!在!请先创建!”请先创建!”,符合。(2) NextElem 测试:表1.3.2-2 NextEle
29、m算法测试用例表测试用例程序输入理论结果运行结果Testi1 .主界面选择9进入函数2 .输入12输出“该元素后继为0”。输出“该元素后继为0”,符合预期。1.主界面选择9进入函数2输入100提示“未找到”输出“未找到”,符合预期。1 .主界面选择9进入函数2 .输入94提示“未找到”输出“未找到”,符合预期。Test21.主界面选择9进入函数2输入12提示“未找到”输出“未找到”,符合预期。无1.主界面选择9进入函数提示“线性表不存在!请先创建!”输出“线性表不存在!请先创建!”,符合。(3) Lisllnsert 测试:表1.3.2-3 Listinsert算法测试用例表测试用例程序输入理
30、论结果运行结果Testi1 .主界面选择10进入函数2 .根据提示输入位置,输入13 .根据提示输入新元素,输入10提示插入成功使用Traverse函数,得到友10,5,12,0,44,94输出“插入成功!”使用Traverse函数,输出“1051204494”,符合预期。1.主界面选择10进入函数2输入63.输入10提示插入成功使用Traverse函数,得到表5,12,0,44,94,10输出插入成功!”使用Traverse函数,输出“5120449410”,符合预期。1 .主界面选择10进入函数2 .输入73 .输入10i值不符要求,提示插入失败输出插入失败!请检查i值”,符合预期。1.主
31、界面选择10进入函数2输入03.输入10i值不符要求,提示插入失败输出“插入失败!请检查i值”,符合预期。Test21.主界面选择10进入函数2输入13.输入10提示插入成功使用Traverse函数,得到表10输出插入成功!”使用Traverse函数,输出“10”,符合预期。1.主界面选择10进入函数2输入23.输入10i值不符要求,提示插入失败输出“插入失败!请检查i值”,符合预期。1.主界面选择10进入函数2输入03.输入10值不符要求,提示插入失败输出插入失败!请检查i值”,符合预期。无1.主界面选择10进入函数提示“线性表不存输出“线性表不存在!在!请先创建!”请先创建!”,符合。(4
32、) ListDelete测试:(与上类似,故简化)表1.3.2-4 ListDelete算法测试用例表测试用例程序输入理论结果运行结果Testi1 .主界面选择11进入函数2 .根据提示输入位置,输入1提示插入成功使用Traverse函数,得到表12,0,44,94输出“插入成功!”使用Traverse函数,输出“1204494”,符合预期。1.主界面选择10进入函数2.输入0i值不符要求,提示插入失败输出“插入失败!请检查 i值”,符合预期。(5) ListTraverse 测试:表132-5 ListTraverse算法测试用例表测试用例程序输入理论结果运行结果Testi主界面选择12进入
33、函数得到表5,12,0,44,94输出“51204494”,符合预期。Test2主界面选择12进入函数提示线性表为空输出“线性表是空表”,符合预期。无主界面选择12进入函数提示“线性表不存在!请先创建!”输出“线性表不存在!请先创建!”,符合。1.4实验小结本次实验加深了对线性表的概念、基本运算的理解,掌握了线性表的基本运算的实现。熟练了线性表的逻辑结构与物理结构的关系。今后的学习过程中应当多从数据结构的角度分析如何进行数据的处理、存储以方便问题的解决,并要勤加练习达到熟能生巧的地步。2基于链式存储结构实现线性表的基本运算2.1 问题描述掌握基于链式存储结构,实现线性表的基本的、常见的运算2.
34、2单链表演示系统设计2.2.1 系统总体设计一共有17个基本函数,具体功能如下(1) InitSqList(SqList * L)操作结果:创建链式表组。(2) InitList(LinkList * L)操作结果:构造一个空的链式表(3) DestroyList(LinkList * L)初始条件:链式表L已存在。操作结果:销毁链式表L。(4) ClearList (LinkList * L)初始条件:链式表L已存在。操作结果:将L重:置为空链式表。(5) ListEmpty(LinkList * L)初始条件:链式表L已存在。操作结果:若L为空链式表,则返回TRUE,否则返回FALSE.(
35、6) ListLength(LinkList * L)初始条件:链式表已存在。操作结果:返回L中数据元素的个数。(7) GetElem(LinkList L,int i,ElemType * e)初始条件:单链表已存在,liListLength(L)。操作结果:用e返回L中第i个结点的数据元素值.(8) LocateElem(LinkList L,ElemType e, Status (*compare)(ElemType a, ElemType b)初始条件:链式表已存在。操作结果:用e返回L中第i个数据元素的值。(9) PriorElem (LinkList L,ElemType cur_
36、e,ElemType * pre_e)初始条件:单链表L已存在。操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。(10) NextElem (LinkList L,ElemType cur_e,ElemType * next_e)初始条件:单链表L已存在。操作结果:若cur_e是L的数据元素,且不是最后-一个,则用next_e返回它的后继,否则操作失败,next_e无定义。(11) ListInsert(LinkList * L,int i,ElemType e)初始条件:链式表L已存在且非空,1 WiListLength(L)+
37、l。操作结果:在L的第i个结点之前插入新数据元素e的结点。(12) ListDelete(LinkList * L,int i,ElemType * e)初始条件:链式表L已存在且非空,iWiWListLength(L)。操作结果:删除L第i个数据元素的结点,用e返回其结点数据元素的值。(13) ListTraverse(LinkList L, Status (*visit)(ElemType a)初始条件:链式表L已存在。操作结果:依次对L的每个数据元素调用函数visit。一旦调用失败,则操作失败。(14) ChooseList(LinkList * L, char s, SqList LO
38、)初始条件:链式表L已存在操作结果:选取已有链式表组中的一组链式表(15) DeleteList(LinkList * L, char s, SqList LO)初始条件:链式表L存在操作结果:删除链式表L(16) ReadList(SqList * L)初始条件:文件夹中保存有链式表操作结果:成功读取链式表L(17) SaveList(SqList L)初始条件:已创建链式表L操作结果:将链式表L保存在创建的文件夹中2.2.3算法设计(1) InitSqList(SqList * L)创建链表组,参数为各个链式表的表头指针地址,从而实现多个链式表的共同管理。复杂度:时间复杂度T(n)= O(
39、l)空间复杂度S(n)= O(l)(2) InitList(LinkList * L)创建空链式表L分三步:1.分配空间2.将数据域初始化为零3.将指针域初始化为0。时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)(3) DestroyList(LinkList * L)销毁链式表分2步:1.将上一个链式表与下一个链式表连接2.释放链式表时间复杂度T(n)= O(l)空间复杂度S(n)= O(l)(4) ClearList (LinkList * L)将链式表置空,先释放链式表的存储空间,再将上一个与下一个链式表连接,最后将自身指针域置空处理,由此达到重置为空表的目的。时间复杂度T
40、(n)= O(l)空间复杂度S(n)= O(l)(5) ListEmpty(LinkList * L)判断链式表是否为空。时间复杂度T(n)=0(n)空间复杂度S(n)= O(l)(6) ListLength(LinkList * L)遍历链表,利用计数器i统计链表元素个数。时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(7) GetElem(LinkList L,int i,ElemType * e)利用结点P遍历链式表L,再利用计数器j来判断是否到达所需位置i,如果到达,则返回该处元素,达到函数目的。时间复杂度T(n)=0(n)空间复杂度S(n)= O(l)(8) Locat
41、eElem(LinkList L,ElemType e, Status (*compare)(ElemType a, Elemiypeb)利用p指针遍历链表,再运用compare函数进行比较,如果在遍历过程中找到元素e 则返回此时计数器i,就是该元素在链表中的位置,由此实现函数功能。时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(9) PriorElem (LinkList L,ElemType cur_e,ElemType * pre_e)参数为链表头指针L,查找的元素cur_e,用于返回其前驱的元素pre_e的地址,Status 成功则返回OK,未找到返回ERROR,若cur
42、_e是L的数据元素,且不是第一个,则用pre_e 返回它的前驱,否则操作失败,pre_e无定义。时间复杂度T(n)=0(n)空间复杂度S(n)= O(l)(10) NextElem (LinkList L,ElemType cur_e,ElemType * next_e)参数为链表头指针L, Status成功则返回OK,未找到返回ERROR,若cur_e是L的数据元素,且不是第一个,则用next_e返回它的后驱,否则操作失败,next_e无定义。时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(11) ListInsert(LinkList * L,int i.ElemType e)输入参数:链表头指针地址&L,插入位置i,插入元素e,在L的第i个结点之前插入新数据元素e的结点。时间复杂度T(n)= O(n)空间复杂度S(n)= O(l)(12) ListDelete(LinkList * L,int i,ElemType * e)链表头指针L,删除位置i,用于返回其值的元素e的地址,删除L第i个数据元素的结点,用e返回其结点数据元素的值。时间复杂度T(n)=0(n)空间复杂度S(n)= O(l)(13) ListTraverse(LinkList L, Status (*visit)(ElemType a)