数据结构上机报告.docx
- 文档编号:28042660
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:102
- 大小:721.08KB
数据结构上机报告.docx
《数据结构上机报告.docx》由会员分享,可在线阅读,更多相关《数据结构上机报告.docx(102页珍藏版)》请在冰豆网上搜索。
数据结构上机报告
课程实验报告
课程名称:
数据结构
专业班级:
学号:
姓名:
指导教师:
报告日期:
计算机科学与技术学院
1课程实验概述
线性表是最常用且最简单的一种数据结构。
简言之,一个线性表是n个数据元素的有限序列。
至于每个数据元素的具体含义,在不同的情况下各不相同。
线性表的长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可进行插入和删除等操作。
树型结构是一类重要的非线性数据结构。
其中以树和二叉树最为重要,直观看来,树是以分支关系定义的层次结构。
本实验将通过C语言来实现线性表顺序储存结构、线性表链式储存结构以及二叉树链表的基本的、常见的运算。
2实验一基于顺序结构的线性表实现
2.1问题描述
基于顺序储存结构,实现线性表的构造、销毁、置空、插入、删除等运算。
2.2系统设计
(1)IntiaList(SqList*L)
操作结果:
构造一个空的线性表L
(2)DestroyList(SqList*L)
初始条件:
线性表L己存在
操作结果:
销毁线性表L
(3)ClearList(SqList*L)
初始条件:
线性表L己存在
操作结果:
将L重置为空表
(4)ListEmpty(SqListL)
初始条件:
线性表已存在
操作结果:
若L为空表,则返回TRUE,否则返回FALSE
(5)ListLength(SqListL)
初始条件:
线性表L已经存在
操作结果:
返回L中数据元素个数
(6)GetElem(SqListL,inti,Elemtype*e)
初始条件:
线性表L己经存在,1<=i<=Listlength(L)
操作结果:
用e返回L中第(i-1)个元素的值
(7)LocatElem(SqListL,Elemtypee,status(*compare)(Elemtype,Elemtype))
初始条件:
线性表L已存在,compare()是元素判定函数
操作结果:
返回L中第1个与e满足关系的数据元素的次序。
若这样的数据元素不存在,则返回值为0
(8)PriorElem(SqListL,Elemtypecur,Elemtype*pre_e)
初始条件:
线性表L已存在
操作结果:
若cur是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义
(9)NextElem(SqListL,Elemtypecur,Elemtype*next_e
初始条件:
线性表L已存在
操作结果:
若cur是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义
(10)ListInsert(SqList*L,inti,Elemtypee)
初始条件:
线性表L已存在,1<=i<=Listlength(L)
操作结果:
在L中第i个位置之前插入新的数据元素e,L的长度加1
(11)ListDelete(SqList*L,inti,Elemtype*e)
初始条件:
线性表L已存在且非空,1<=i<=Listlength(L)
操作结果:
删除线性表的第i个数据元素,并用e返回其值,L的长度减1
(12)ListTrabverse(SqListL,void(*visit)(Elemtypee))
初始条件:
线性表L已存在
操作结果:
依次对L的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败
(13)SaveList(SqListL)
初始条件:
线性表L已存在
操作结果:
将线性表存盘保存
(14)statusLoadList(SqList*L)
初始条件:
线性表L已存在
操作结果:
从磁盘读取数据并构造线性表
2.3系统实现
(1)statusIntiaList(SqList*L)
{
L->elem=(Elemtype*)malloc(LIST_INIT_SIZE*sizeof(Elemtype));
if(!
L->elem)exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
returnOK;
}
运行结果
(2)statusDestroyList(SqList*L)
{
if(!
L)returnOK;
if(L->elem)
{
free(L->elem);
free(L);
returnOK;
}
returnERROR;
}
运行结果
(3)statusClearList(SqList*L)
{
L->length=0;
returnOK;
}
运行结果
(4)statusListEmpty(SqListL)
{
if(L.length==0)returnTRUE;
elsereturnFALSE;
}
运行结果
(5)intListLength(SqListL)
{
return(L.length);
}
运行结果
(6)statusGetElem(SqListL,inti,Elemtype*e)
{
if(i<1||i>L.length)returnFALSE;
else*e=L.elem[i-1];
returnOK;
}
运行结果
(7)statusLocatElem(SqListL,Elemtypee,status(*compare)(Elemtype,Elemtype))
{
inti;
for(i=1;i<=L.length;i++)
if(compare(L.elem[i-1],e))
returni;
returnFALSE;
}
运行结果
(8)statusPriorElem(SqListL,Elemtypecur,Elemtype*pre_e)
{
Elemtype*p=&cur;
inti;
for(i=0;L.elem[i+1].item1!
=p->item1&&(i i++; if(i>=L.length) returnFALSE; *pre_e=L.elem[i]; returni; } 运行结果 (9)statusNextElem(SqListL,Elemtypecur,Elemtype*next_e) { Elemtype*p=&cur; inti; for(i=0;L.elem[i].item1! =p->item1&&(i i++; if(i==L.length) returnFALSE; *next_e=L.elem[i+1];returnTRUE; } 运行结果 (10)statusListInsert(SqList*L,inti,Elemtypee) { Elemtype*t,*p,*q; if(i<1||i>L->length+1)returnERROR; if(L->length>=L->listsize) { t=(Elemtype*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Elemtype)); if(! t)exit(OVERFLOW); L->elem=t; L->listsize+=LISTINCREMENT; } q=&(L->elem[i-1]); for(p=&(L->elem[L->length-1]);p>=q;--p) *(p+1)=*p; *(p+1)=e; L->length++; returnOK; } 运行结果 (11)statusListDelete(SqList*L,inti,Elemtypee) { Elemtype*p,*q; if(i==1||i>L->length)returnERROR; q=&L->elem[i-1]; *e=*q; p=L->elem+L->length-1; for(++q;q<=p;++q) *(q-1)=*q; L->length--; returnOK; } 运行结果 (12)statusListTrabverse(SqListL,void(*visit)(Elemtypee)){ inti; if(! L.length)return(0); printf("\n-------------allelementsoflieartable----------------\n"); for(i=0;i return (1); } 运行结果 (13)statusSaveList(SqListL){ if(! L.elem) returnERROR; FILE*out; if((out=fopen("c: \\abc.dat","wb"))==NULL) return(-3); fwrite(L.elem,sizeof(Elemtype),L.length,out); fclose(out); returnOK; } 运行结果 (14)statusLoadList(SqList*L){ if(! L->elem) returnERROR; FILE*in; Elemtypee; if((in=fopen("c: \\abc.dat","rb"))==NULL) return(-3); do{ if(L->length>=L->listsize) { L->elem=(Elemtype*)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(Elemtype)); if(! L->elem)returnOVERFLOW; L->listsize+=LISTINCREMENT; } if(fread(&e,sizeof(Elemtype),1,in)! =NULL){ L->elem[L->length]=e; L->length++; } }while(! feof(in)); fclose(in); returnOK; } 运行结果 2.4效率分析 各功能时间复杂度如下,n为线性表长度: (1)构造线性表LT(n)=O (1) (2)销毁线性表LT(n)=O (1) (3)置空线性表LT(n)=O (1) (4)判断线性表L是否为空T(n)=O (1) (5)计算线性表L元素个数T(n)=O (1) (6)查询线性表L元素值T(n)=O (1) (7)查询线性表L元素位置T(n)=O(n) (8)查询线性表L元素前驱位置T(n)=O(n) (9)查询线性表L元素后继位置T(n)=O(n) (10)在线性表L中插入元素平均时间复杂度Tave(n)=O(n);最好时间复杂度Tb(n)=O (1);最坏时间复杂度Tw(n)=O(n) (11)在线性表L中删除元素平均时间复杂度Tave(n)=O(n);最好时间复杂度Tb(n)=O (1);最坏时间复杂度Tw(n)=O(n) (12)遍历线性表LT(n)=O(n) (13)保存线性表LT(n)=O(n) (14)读取线性表LT(n)=O(n) 3实验二基于链式结构的线性表实现 3.1问题描述 基于链式储存结构,实现线性表的构造、销毁、置空、插入、删除等运算。 3.2系统设计 (1)IntiaList(LinkList*L) 操作结果: 构造一个空的线性表L (2)DestroyList(LinkList*L) 初始条件: 线性表L己存在 操作结果: 销毁线性表L (3)ClearList(LinkList*L) 初始条件: 线性表L己存在 操作结果: 将L重置为空表 (4)ListEmpty(LinkListL) 初始条件: 线性表已存在 操作结果: 若L为空表,则返回TRUE,否则返回FALSE (5)ListLength(LinkListL 初始条件: 线性表L已经存在 操作结果: 返回L中数据个数 (6)GetElem(LinkListL,inti,Elemtype*e) 初始条件: 线性表L己经存在,1<=i<=Listlength(L) 操作结果: 用e返回L中第(i-1)个元素的值 (7)LocatElem(LinkListL,Elemtypee,status(*compare)(Elemtype,Elemtype)) 初始条件: 线性表L已存在,compare()是元素判定函数 操作结果: 返回L中第1个与e满足关系的数据元素的次序。 若这样的数据元素不存在,则返回值为0 (8)PriorElem(LinkListL,Elemtypecur,Elemtype*pre_e) 初始条件: 线性表L已存在 操作结果: 若cur是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义 (9)NextElem(LinkListL,Elemtypecur,Elemtype*next_e 初始条件: 线性表L已存在 操作结果: 若cur是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义 (10)ListInsert(LinkList*L,inti,Elemtypee) 初始条件: 线性表L已存在,1<=i<=Listlength(L) 操作结果: 在L中第i个位置之前插入新的数据元素e,L的长度加1 (11)ListDelete(LinkList*L,inti,Elemtype*e) 初始条件: 线性表L已存在且非空,1<=i<=Listlength(L) 操作结果: 删除线性表的第i个数据元素,并用e返回其值,L的长度减1 (12)ListTrabverse(LinkListL,void(*visit)(Elemtypee)) 初始条件: 线性表L已存在 操作结果: 依次对L的每个数据元素调用函数visit()。 一旦visit()失败,则操作失败 (13)SaveList(LinkListL) 初始条件: 线性表L已存在 操作结果: 将线性表存盘保存 (14)LoadList(LinkList*L) 初始条件: 线性表L已存在 操作结果: 从磁盘读取数据并构造线性表 3.3系统实现 (1)statusIntiaList(LinkList*L) { (*L)=(LinkList)malloc(sizeof(L)); (*L)->next=NULL; returnOK; } 运行结果 (2)statusDestroyList(LinkList*L) { structL*p; p=(*L)->next; while(p) { structL*r=p; p=p->next; free(r); } (*L)->next=NULL; returnOK; } 运行结果 (3)statusClearList(LinkList*L) { LinkListp,q; p=(*L)->next; (*L)->next=NULL; while(p){ q=p; p=p->next; free(q); } returnOK; } 运行结果 (4)statusListEmpty(LinkListL) { Lnode*p; p=L->next; if(p)returnTRUE; returnFALSE; } 运行结果 (5)intListLength(LinkListL) { intlength=0; L=L->next; while(L){ length++; L=L->next; } returnlength; } 运行结果 (6)statusGetElem(LinkListL,inti,Elemtype*e) { intj=0; Lnode*p=L; while(p&&j { p=p->next; j++; } if(! p||j>i-1)returnERROR; *e=p->data; returnOK; } 运行结果 (7)intLocateElem(LinkListL,Elemtypee,status(*compare)(Elemtype,Elemtype)) { inti=0; LinkListp=L->next; while(p){ i++; if(compare(p->data,e))returni; p=p->next; } return0; } 运行结果 (8)statusPriorElem(LinkListL,Elemtypecur,LinkList*pre_e) { Elemtype*p=&cur; inti=1; while(L&&(L->next->data.item1! =p->item1)) { L=L->next; i++; } if(L) { *pre_e=L; returni; } returnFALSE; } 运行结果 (9)statusNextElem(LinkListL,Elemtypecur_e,LinkList*next_e) { Elemtype*p=&cur_e; inti=1; while(L&&(L->data.item1! =p->item1)) { L=L->next; i++; } if(L->next) { *next_e=L->next; returni; } return0; } 运行结果 (10)statusListInsert(LinkList*L,inti,Elemtypee) { intj=0; LinkListp=L,s; while(p&&j { p=p->next; j++; } if(! p||j>i-1)returnERROR; s=(LinkList)malloc(sizeof(L)); s->data=e; s->next=p->next; p->next=s; returnOK; } 运行结果 (11)statusListDelete(LinkList*L,inti,Elemtype*e) { intj=0; LinkListp=L,q; while(p->next&&j { p=p->next; j++; } if(! (p->next)||j>i-1)returnERROR; q=p->next; p->next=q->next; *e=q->data; free(q); returnOK; } 运行结果 (12)statusListTrabverse(LinkListL,void(*visit)(Elemtypee)){ inti; if(! L.length)return(0); printf("\n-------------allelementsoflieartable----------------\n"); for(i=0;i return (1); } 运行结果 (13)statusSaveList(LinkListL){ if(! L) returnERROR; FILE*out; LinkListp; p=L; if((out=fopen("c: \\aaa.dat","wb"))==NULL) return-3; while(p! =NULL) { fwrite(p,sizeof(Lnode),1,out); } fclose(out); returnOK; } 运行结果 (14)statusLoadList(LinkList*L) { FILE*in; LinkList*p; if((in=fopen("c: \\aaa.dat","rb"))==NULL) return-3; while(! feof(in)) { p=(LinkList)malloc(sizeof(Lnode)); fread(p,sizeof(Lnode),1,in); } L=p; fclose(in); } 运行结果 3.4效率分析 各功能的时间复杂度如下,n为线性表长度 (1)构造线性表LT(n)=O (1) (2)销毁线性表LT(n)=O(n) (3)置空线性表LT(n)=O(n) (4)判断线性表L是否为空T(n)=O (1) (5)计算线性表L元素个数T(n)=O(n) (6)查询线性表L元素值T(n)=O(n) (7)查询线性表L元素位置T(n)=O(n) (8)查询线性表L元素前驱位置T(n)=O(n) (9)查询线性表L元素后继位置T(n)=O(n) (10)在线性表L中插入元素平均时间复杂度Tave(n)=O(n);最好时间复杂度Tb(n)=O (1);最坏时间复杂度Tw(n)=O(n) (11)在线性表L中删除元素平均时间复杂度Tave(n)=O(n);最好时间复杂度Tb(n)=O (1);最坏时间复杂度Tw(n)=O(n) (12)遍历线性表LT(n)=O(n) (13)保存线性表LT(n)=O(n) (14)读取线性表LT(n)=O(n) 4实验三基于二叉链表的二叉树实现 4.1问题描述 基于二叉链表,实现二叉树的构造、销毁、置空、插入、删除等运算。 4.2系统设计 (1)InitBiTree(BiTNode**T) 操作结果: 构造空二叉树 (2)DestroyBiTree(BiTNode**T) 初始条件: 二叉树T存在 操作结果: 销毁二叉树T (3)CreateBiTree(BiTNode**T,char*definition) 初始条件: definition给出二叉树T的定义 操作结果: 按defin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 上机 报告