1、单链表的基本运算实验报告课 程 数据结构教程 班 级 学 号 姓 名 实验项目数 2014年04月说明:1.实验预习:通过实验预习,明确实验目的要求、实验原理及相关知识点、实验方法、步骤以及操作注意事项等;对设计性实验要事先设计实验方案;根据需要合理设计实验数据记录表格。2.实验过程:实际采用的实验方法、步骤、操作过程或实验设计方案(设计型实验)的描述。对于实验结果的表述一般有以下两种方法,在撰写实验报告时,可任选其中一种或两种方法并用,以获得最佳效果。(1)文字表述: 根据实验目的将原始资料系统化、条理化,用准确的专业语言客观地描述实验现象和结果,要体现时间顺序以及各项指标在时间上的关系。
2、(2)图表或图形表示: 利用表格、坐标图、绘画或利用记录仪器描绘出的曲线图,使实验结果突出、清晰、形象、直观。 3.数据分析、实验结论 (1)根据相关的理论知识对所得到的实验结果进行解释和分析,包括实验成功或失败的原因。(2)不能因实验结果与预期的结果或理论不符而随意取舍甚至修改实验原始数据和伪造实验结果。如果实验失败,应找出原因及今后应注意的事项。4. 任课老师可结合学科和专业课程特点,对实验报告内容作科学合理的调整。5学生在课程结束后将本门课程所有实验报告装订成册,任课教师负责收齐交实验室存档实验 一 (实验项目序号) 数据结构教程 课程实验报告 实验地点: 2-504 实 验名 称单链表
3、的基本运算指 导 教 师实验时间2014-4-17姓 名学号成绩一、 实验、训练目的1. 了解单链表基本运算的实现;2. 进一步掌握链表使用的步骤;3. 牢固掌握建立单链表算法,特别是尾插法建表算法,是很多其他复杂复杂的基础;二、实验预习(含实验原理及设计过程等)单链表的基本运算,包括:插入结点运算,删除结点运算,建立单链表,线形表基本运算实现设计过程:编写一个程序algo2-2.cpp 实现单链表的各种与运算,在此基础上设计一个主程序exp2-2.cpp完成功能。三、实验、训练内容编写一个程序algo2-2.cpp.实现单链表的各种基本运算,并在此基础上设计一个主程序完成如下功能:1. 初始
4、化顺序表h;2. 依次采用尾插法插入a,b,c,d,e元素;3. 输出单链表h;4. 输出单链表h长度;5. 判断单链表h是否为空;6. 输出单链表h的第3个元素;7. 输出元素a 的位置;8. 在第4个元素位置上插入“f”元素;9. 输出单链表h;10. 删除单链表h的第3个元素;11. 输出单链表h;12. 释放单链表h。四、实验、训练过程(含实验步骤、测试数据、实验结果等)启动visual c+6.0,建立一个工作区名为proj2-2 files,建立一个工作空间名为source files,建立一个文件名为algo2-2.cpp编写程序,在此基础上建立一个主程序exp2-2.cpp。5
5、、数据分析、实验结论与讨论源代码#include#include#define bool int#define TRUE 1#define FALSE 0 /后面有分号typedef char ElemType; /后面有分号/*LinkList类型定义*/typedef struct LNode ElemType data; struct LNode *next;LinkList,*PLinkList;/*基本运算*/*(1)初始化线性表InitList(L)*分配内存创建头节点, 指针域设为空*/*void InitList(LinkList *L) L=(LinkList *)mallo
6、c(sizeof(LinkList); L-next=NULL;*/void InitList(LinkList *L) /初始化线性表 (*L)=(LinkList *)malloc(sizeof(LinkList); /创建头结点 (*L)-next=NULL;/*(2)销毁线性表DestroyList(L)*释放单链表L占用的空间, 即逐一释放全部节点的空间*/void DestroyList(LinkList *L) LinkList *pre=L, *p=L-next; /pre指向*p的前驱节点 while(p!=NULL) free(pre); pre=p; p=pre-next
7、; free(pre);/*(3)判断线性表是否为空表ListEmpty(L)*布尔型, 即判断头节点的指针域时候为空*/bool ListEmpty(LinkList *L) return(L-next=NULL);/*(4)求线性表的长度ListLength(L)*int型, 遍历并累加计算*/int ListLength(LinkList *L) int length=0; LinkList *p=L; /p指向头节点, count=0(头节点的序号为) while(p-next!=NULL) length+; p=p-next; return(length);/*(5)输出线性表Dis
8、pList(L)*逐一扫描, 输出数据域*/void DispList(LinkList *L) /输出线性表 LinkList *p=L-next; while (p!=NULL) printf(%c ,p-data); p=p-next; printf(n);/*(6)求线性表中某个数据元素的值GetElem(L,i,e)*bool型, 第i个节点, 其值赋给e*/bool GetElem(LinkList *L,int i,ElemType *e) int j=0; LinkList *p=L; while(jnext; if(p=NULL) return FALSE; else pri
9、ntf(); (*e)=p-data; return TRUE; /*(7)按元素值查找LocateList(L,e)*int型,第个值域与e相等的节点, 找到返回逻辑序号(1,2,3.), 否则返回*/int LocateList(LinkList *L,ElemType e) int i=1; LinkList *p=L-next; while(p!=NULL&p-data!=e) /先判断是否已经到链表末尾 p=p-next; i+; if(p=NULL) return(0); else return(i);/*(8)插入数据元素ListInsert(L,i,e)*bool型, 在第i-
10、1个节点后面插入数据域为e的节点, 使其成为第i个节点*P.S.在单链表中, 插入一个节点必须先找到插入改节点的前驱节点*/bool ListInsert(LinkList *L,int i,ElemType e) int j=0; LinkList *p, *s;/ printf(666n);/ L=(LinkList *)malloc(sizeof(LinkList);/ L-next=NULL; p=L; while(jnext; if(p=NULL) return FALSE; else s=(LinkList *)malloc(sizeof(LinkList); s-data=e;
11、s-next=p-next; /到这里错了 p-next=s; return TRUE; /*(9)删除数据元素ListDelete(L,i,e)*bool型, .*/bool ListDelete(LinkList *L,int i,ElemType e) int j=0; LinkList *p=L,*q; while(jnext; if(p=NULL) return FALSE; else q=p-next; if(q=NULL) return FALSE; e=q-data; p-next=q-next; free(q); return TRUE; #include#include#d
12、efine bool int#define TRUE 1#define FALSE 0 /后面有分号typedef char ElemType; /后面有分号/*LinkList类型定义*/typedef struct LNode ElemType data; struct LNode *next;LinkList;/*函数声明*/extern void InitList(LinkList *L);/extern void DestroyList(LinkList *L);/extern bool ListEmpty(LinkList *L);/extern int ListLength(Li
13、nkList *L);/extern void DIspList(LinkList *L);/extern bool GetElem(LinkList *L,ElemType i,ElemType *e);/extern int LocateList(LinkList *L,ElemType e);/extern bool ListInsert(LinkList *L,int i,ElemType e);/extern bool ListDelete(LinkList *L,int i,ElemType e);void main() int i1, i2, i3, i4, i5; LinkLi
14、st *h; ElemType e; printf(单链表的基本运算如下:n); printf(1)初始化单链表hn); InitList(&h); printf(%s,h-next); printf(2)依次采用尾插法插入a,b,c,d,e元素n); /* i1= ListInsert(h,1,a); printf(%dn,i1); printf(%cn,h-data); /无法用指针p检验第一个节点的数据域, 因为执行完i1语句后, p已经指向下一个节点了 i2= ListInsert(h,2,b); i3= ListInsert(h,3,c); i4= ListInsert(h,4,d)
15、; i5= ListInsert(h,5,e); printf(%d %d %d %d %d ,i1, i2, i3, i4, i5 ); */ ListInsert(h,1,a); ListInsert(h,2,b); ListInsert(h,3,c); ListInsert(h,4,d); ListInsert(h,5,e); printf(3)输出单链表h:); DispList(h); printf(4)单链表h的长度=%dn,ListLength(h); printf(5)单链表h为%sn,ListEmpty(h)?空:非空); GetElem(h,5,&e); printf(6)
16、单链表h的第个元素=%cn,e); printf(7)元素a的位置=%dn,LocateList(h,a); printf(8)在第的元素位置上插入f元素n); ListInsert(h,4,f); printf(9)输出单链表h:); DispList(h); printf(10)删除h的第个元素n); ListDelete(h,3,e); printf(11)输出单链表h:); DispList(h); printf(12)释放单链表hn); DestroyList(h);执行结果:六、心得体会通过此次实验,让我懂得了单链表的基本运算,它包括插入结点运算,删除结点运算,建立单链表,线形表基本运算,也知道了尾插法的基本方法。七、教师评语教师签名:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1