某农业大学数据结构上机实验指导书及答案.pdf
《某农业大学数据结构上机实验指导书及答案.pdf》由会员分享,可在线阅读,更多相关《某农业大学数据结构上机实验指导书及答案.pdf(174页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目 录实验一线性表.1(-)实验目的.1(-)实验内容.1(三)实验报告.22实验二堆栈.24(-)实验目的.24(-)实验内容.24(三)实验报告.43实验三队列.44(-)实验目的.44(-)实验内容.44(三)实验报告.51实验四模式匹配.52(一)实验目的.52(-)实验内容.52(三)实验报告.58实验五二叉树.59(-)实验目的.59(-)实验内容.59(三)实验报告.86实验六查找.87(-)实验目的.87(-)实验内容.87(三)实验报告.96实验七内部排序.97(-)实验目的.97(-)实验内容.97(三)实验报告.114实验八 图和图的遍历.1 1 5(-)实验目的.1 1
2、 5(-)实验内容.1 1 5(三)实验报告.1 3 2数据结构课程设计(2 0 0 7 级用,仅做参考).1 3 3(-)数据结构课程设计安排.1 3 3(二)图算法实验题目.1 3 3(三)团队题目(各种排序算法效率分析).1 3 3 数据结构模拟试卷一.1 3 7 数据结构模拟试卷二.1 4 0附录1:实验报告及习题.1 4 3实验名称:线 性 表(一).1 4 3实验名称:堆 栈(二).1 4 5实验名称:队 列(三).1 4 7实验名称:模式匹配(四).1 5 0实验名称:二 叉 树(五).1 5 2实验名称:查 找(六).1 5 4实验名称:内部排序(七).1 5 6实验名称:图和
3、图的遍历(八).1 6 0设计性、综合性实验.1 6 2附录2数据结构课程设计完成情况登记表.1 6 3附录3图的应用.1 6 4实验一线性表(-)实验目的(1)(2)(3)掌握线性表的顺序存储掌握线性表的链式存储掌握基本算法(建表、插入、删除)的实现(二)实验内容1.线性表的顺序存储:掌握线性表的顺序存储结构及其基本操作、合并、逆置等算法设顺序表的存储结构定义如F:(同学们可扩展考虑其他形式的存储结构定义)#define LISTJNIT_SIZE 100/线性表存储空间的初始分配量#define LISTINCREMENT 10/线性表存储空间的分配增量typedef struct(int
4、*elem;/存储空间基址int length;/当前长度int listsize;/当前分配的存储容量(以 sizeof(int)为单位)JSqList;题 目 1:编写算法,创建初始化容量为LISTNIT_SIZE的顺序表T,并实现插入、删除、遍历操作。本题目给出部分代码,请补全内容。#include#include#define OK 1#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef struct(int*elem;int length;int lis
5、tsize;JSqList;int InitList_Sq(SqList&L)算法2.3,构造一个空的线性表L,该线性表预定义大小为LISTNIT_SIZE/请补全代码int Load_Sq(SqList&L)(输出顺序表中的所有元素int i;if()DrintfCThe List is empty!):/请填空else(printf(The List is:);for()printf(%d,):/请填空)printf(n);return OK;1int ListInsert_Sq(SqList&L,int i,int e)/算法2.4,在顺序线性表L 中第i 个位置之前插入新的元素ei 的
6、合法值为 lWiWL.length+1/请补全代码int ListDelete_Sq(SqList&L,int i,int&e)/算法2.5,在顺序线性表L 中删除第i 个位置的元素,并用e 返回其值/i 的合法值为lWiL.length/请补全代码int main()(SqList T;int a,i;ElemType e,x;if()/判断顺序表是否创建成功,请填空(printf(A Sequence List Has CreatedAn);)while(l)printf(l:Insert elementn2:Delete elementn3:Load all elementsnO:Exi
7、tnPlease choose:nH);scanf(cT,&a);switch(a)(case 1:scanf(,%d%d,&i,&x);if()printf(uInsert Error!nM);/判断 i 值是否合法,请填空else printf(nThe Element%d is Successfully Inserted!n,x);break;case 2:scanf(n%dn,&i);if()printf(uDelete Error!nu);/判断 i 值是否合法,请填空else printf(The Element%d is Successfully Deleted!n,e);bre
8、ak;case 3:Load_Sq(T);break;case 0:return 1;测试样例格式说明:根据菜单操作:1、输 入 1,表示要实现插入操作,紧跟着要输入插入的位置和元素,用空格分开2、输入2,表示要实现删除操作,紧跟着要输入删除的位置3、输入3,表示要输出顺序表的所有元素4、输入0,表示程序结束完整代码:#include#include#define OK 1#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef struct(int*elem,len
9、gth,listsize;JSqList;int InitList_Sq(SqList&L)L.elem=(ElemType*)ma11oc(LIST_INIT_SIZE*sizeof(ElemType);L.length=O;L.listsize=LIST_INIT_SIZE;return OK;)int Load_Sq(SqList&L)(inti;if(L.length=O)printf(The List is empty!);else(printf(The List is:);for(i=0;iL.length;i+)printf(u%dL.elemi);)printf(Hnn);re
10、turn OK;)int ListInsert_Sq(SqList&L,int i,int e)(if(iL.length+l)return ERROR;ElemType*newbase,*q,*p;if(L.length=L.listsize)(newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);L.elem=newbase;L.listsize+=LISTINCREMENT;)q=&(L.elemi-l);for(p=&(L.elemL.length-1 );p=q;-p)*(p+l)=
11、*p;*q=e;+L.length;return OK;)int ListDelete_Sq(SqList&L,int i,int&e)(ElemType*q,*p;if(iL.length)return ERROR;p=&(L.elemi-l);e=*p;q=L.elem+L.length-1;for(+p;p=q;p+)*(pl)=*p;L.length;return OK;)int main()(SqList T;int a,i;ElemType e,x;if(InitList_Sq(T)(printf(A Sequence List Has CreatedAn);)while(l)(p
12、rintf(nl:Insert elementn2:Delete elementn3:Load all elementsnO:ExitnPlease choose:nM);scanf(%du,&a);switch(a)(case 1:scanf(n%d%dn,&i,&x);if(!ListInsert_Sq(T,i,x)printf(Insert Error!nM);elseprintf(The Element%d is Successfully Inserted!n,x);break;case 2:scanf(H%dH,&i);if(!ListDelete_Sq(T,i,e)printf(u
13、Delete Error!nu);elseprintf(nThe Element%d is Successfully Deleted!n,e);break;case 3:Load_Sq(T);break;case 0:return 1;)题 目 2:编写算法,将两个非递减有序顺序表A和 B合并成一个新的非递减有序顺序表C。本题不提供代码,请同学们独立完成,所需子函数参考前面题目1 完成的内容。测试样例格式说明:I键盘输入第一行第二行第三行第四行顺序表A 的元素个数顺序表A 的各元素(非递减),用空格分开顺序表B 的元素个数顺序表B 的各元素(非递减),用空格分开 正确输出第一行:顺序表A 的元
14、素列表第二行:顺序表B 的元素列表第三行:合并后顺序表C 的元素列表测试样例:第 组 自 测 数 据 第二组自测数据 键盘输入 键盘输入5/6/1 3 5 7 9/12 24 45 62 84 9 6/5/4/2 4 6 8 10/15 31 75 8 6/正确输出 正确输出ListA:l 3 5 7 9List A:12 24 45 62 84 96List B:2 4 6 8 10List B:15 31 75 86ListC:l 2 3 4 5 6 7 89 10List C:12 15 24 31 45 62 75 84 86 96完整代码:#include#include#defin
15、e OK 1#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef struct(int*elem,lengthJistsize;JSqList;int InitList_Sq(SqList&L)(L.elem=(ElemType:imaIloc(LIST_INIT_SIZE*sizeof(ElemType);L.length=O;L.listsize=LIST_INIT_SIZE;return OK;)int Load_Sq(SqList&L)(inti;fbr(
16、i=0;iL.length;i+4-)printf(*%d,L.elemi);printf(HnH);return OK;int ListLength(SqList L)(return L.length;)int GetElem(SqList L,int i,ElemType&e)(e=L.elemi-l;return OK;)int ListInsert_Sq(SqList&L,int i,int e)(if(iL.length+l)return ERROR;ElemType*p,*q,*newbase;if(L.listsize=q;p-)*(p+l)=*p;*q=e;L.length+;
17、return OK;)void MergeList(SqList La,SqList Lb,SqList&Lc)(int ij,k,La_len,Lb_len,ai,bj;i=j=I;k=0;InitList_Sq(Lc);La_len=ListLength(La);Lb_len=ListLength(Lb);while(i=La_len)&(j=Lb_len)(GetElem(La,i,ai);GetElem(Lbj,bj);if(ai=bj)ListInsert_Sq(Lc,+k,ai);i+;)else(ListInsert_Sq(Lc,+k,bj);j+;while(i=La_len)
18、(GetElem(La,i+,ai);ListInsert_Sq(Lc,+k,ai);)while(j=Lb_len)(GetElem(Lbj+4-,bj);ListInsert_Sq(Lc,+k,bj);)Load_Sq(Lc);)int main()(int an,bn,i,e;SqList La,Lb,Lc;InitList_Sq(La);scanf(d”,&an);fbr(i=l;i=an;i+)(scanf(%dn,&e);ListInsert_Sq(La,i,e);)printf(ListA:);Load_Sq(La);InitList_Sq(Lb);scanf(,%d,&bn);
19、fbr(i=l;i=an;i+)(scanf(%d,&e);ListInsert_Sq(Lb,i,e);)printf(MList B:);Load_Sq(Lb);printf(HList C:);MergeList(La,Lb,Lc);return 0;)题 目 3:设有一顺序表A=(即闭,其 逆 顺 序 表 定 义 为 A=(az,.,即 西,珀。设计一个算法,将顺序表逆置,要求顺序表仍占用原顺序表的空间。本题不提供代码,请同学们独立完成,所需子函数参考前面题目1 完成的内容。测试样例格式说明:键盘输入第一行:输入顺序表的元素个数第二行:输入顺序表的各元素,用空格分开 正确输出J第一行:逆
20、置前的顺序表元素列表第二行:逆置后的顺序表元素列表测试样例:第一组自测数据 键盘输入10/1 2 3 4 5 6 7 8 9 10/正确输出The List is:l 2 3 4 5 6 7 8 9 10The turned List is:10 9 8 7 6 5 4 3 2 I 第二组自测数据 键盘输入8/32 97 54 65 35 84 61 7 5/正确输出The List is:32 97 54 65 35 84 61 75The turned List is:75 61 84 35 65 54 97 322.线性表的链式存储:掌握线性表的链式存储结构及其基本操作、合并、逆置等算法
21、。本实验以单链表为例,在完成题目的过程中,同学们可扩展考虑双链表及循环链表等结构的操作。设单链表的存储结构定义如下:(同学们可扩展考虑其他形式的存储结构定义)#includetypedef struct LNode(intdata;/存储在结点中的数据struct LNode*next;指向下一结点的指针 LNode,*LinkList;完整代码:#include#include#define OK 1#define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef stru
22、ct(int*elem,length,listsize;SqList;int InitList_Sq(SqList&L)(L.elem=(ElemType*)manoc(LISTNIT_SIZE*sizeof(ElemType);if(!L.elem)(printf(NOln);return ERROR;)L.length=0;L.listsize=LIST_INIT_SIZE;return OK;int Load_Sq(SqList&L)(int i;if(!L.length)(printf(This List is empty!nH);return ERROR;)else(for(i=0;
23、i=L.listsize)newbase=(ElemType:)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)(printf(nNO2n);return ERROR;L.elem=newbase;L.listsize+=LISTINCREMENT;q=&(L.elemi-l);for(p=&(L.elemL.length-1 );p=q;p-)*(p+l)=*p;*q=e;L.length+;return OK;int swap(SqList&L,int n)(int i,j,temp;fbr(i=
24、O,j=n-1 ;ji;i+,j-)(temp=L.elemliJ;L.elem i=L.elemj;L.elemjJ=temp;)return OK;)int main()(SqList T;int n,i;ElemType x;scanf(d”,&n);InitList_Sq(T);fbr(i=l;in+l;i+)(scanf(n%dn,&x);ListInsert_Sq(T,i,x);)printf(nThe List is:);Load_Sq(T);swap(T,n);printf(The turned List is:);Load_Sq(T);return 0;题 目 4:编写算法,
25、创建一个含有n 个元素的带头结点的单链表L 并实现插入、删除、遍历操作。本题目提供部分代码,请补全内容#include#include#define ERROR 0#define OK 1#define ElemType inttypedef struct LN ode(int data;struct LNode*next;LNode,*LinkList;int CreateLink_L(LinkList&LJnt n)/创建含有n 个元素的单链表LinkList p,q;int i;ElemType e;L=(LinkList)malloc(sizeof(LNode);L-next=NULL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 农业大学 数据结构 上机 实验 指导书 答案
限制150内