ImageVerifierCode 换一换
格式:DOC , 页数:175 ,大小:697.50KB ,
资源ID:8351800      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-8351800.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(华南农业大学数据结构上机实验指导书及答案.doc)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

华南农业大学数据结构上机实验指导书及答案.doc

1、I目 录实验一 线性表 2(一) 实验目的 2(二) 实验内容 2(三) 实验报告 10实验二 堆栈 11(一) 实验目的 11(二) 实验内容 11(三) 实验报告 18实验三 队列 19(一) 实验目的 19(二) 实验内容 19(三) 实验报告 22实验四 模式匹配 23(一) 实验目的 23(二) 实验内容 23(三) 实验报告 26实验五 二叉树 27(一) 实验目的 27(二) 实验内容 27(三) 实验报告 34实验六 查找 35(一) 实验目的 35(二) 实验内容 35(三) 实验报告 39实验七 内部排序 40(一) 实验目的 40(二) 实验内容 40(三) 实验报告 4

2、1实验八 图和图的遍历 42II(一) 实验目的 42(二) 实验内容 42(三) 实验报告 48数据结构课程设计(2007 级用,仅做参考) 49(一) 数据结构课程设计安排 49(二) 图算法实验题目 49(三) 团队题目(各种排序算法效率分析) 49数据结构模拟试卷一 53数据结构模拟试卷二 56附录 1:实验报告及习题 .59实验名称:线性表(一) 59实验名称:堆栈(二) .61实验名称:队列(三) .63实验名称:模式匹配(四) .66实验名称:二叉树(五) .68实验名称:查找(六) .70实验名称:内部排序(七) .72实验名称:图和图的遍历(八) .76设计性、综合性实验 .

3、78附录 2 数据结构课程设计完成情况登记表 .79附录 3 图的应用 .801实验一 线性表(一 ) 实验目的(1) 掌握线性表的顺序存储(2) 掌握线性表的链式存储(3) 掌握基本算法(建表、插入、删除)的实现(二 ) 实验内容1. 线性表的顺序存储:掌握线性表的顺序存储结构及其基本操作、合并、逆置等算法设顺序表的存储结构定义如下:(同学们可扩展考虑其他形式的存储结构定义)#define LIST_INIT_SIZE 100 / 线性表存储空间的初始分配量#define LISTINCREMENT 10 / 线性表存储空间的分配增量typedef structint *elem; / 存储

4、空间基址int length; / 当前长度int listsize; / 当前分配的存储容量(以 sizeof(int)为单位)SqList;题目 1:编写算法,创建初始化容量为 LIST_INIT_SIZE 的顺序表 T,并实现插入、删除、遍历操作。本题目给出部分代码,请补全内容。#include#include#define OK 1 #define ERROR 0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef structint *elem;int length;int list

5、size;SqList;int InitList_Sq(SqList if( ) printf(“The List is empty!“); / 请填空elseprintf(“The List is: “);for( ) printf(“%d “, ); / 请填空printf(“n“);return OK;int ListInsert_Sq(SqList int a, i;ElemType e, x;if( ) / 判断顺序表是否创建成功,请填空printf(“A Sequence List Has Created.n“);while(1)printf(“1:Insert elementn2

6、:Delete elementn3:Load all elementsn0:ExitnPlease choose:n“);scanf(“%d“,switch(a)3case 1: scanf(“%d%d“,if( ) printf(“Insert Error!n“); / 判断 i 值是否合法,请填空else printf(“The Element %d is Successfully Inserted!n“, x); break;case 2: scanf(“%d“,if( ) printf(“Delete Error!n“); / 判断 i 值是否合法,请填空else printf(“Th

7、e Element %d is Successfully Deleted!n“, e);break;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 LISTINCREMEN

8、T 10#define ElemType inttypedef structint *elem,length,listsize;SqList;int InitList_Sq(SqList L.length=0;L.listsize=LIST_INIT_SIZE;return OK;4int Load_Sq(SqList if(L.length=0)printf(“The List is empty!“);elseprintf(“The List is:“);for(i=0;iL.length+1)return ERROR;ElemType *newbase,*q,*p;if(L.length=

9、L.listsize)newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);L.elem=newbase;L.listsize+=LISTINCREMENT;q=for(p=p=q;-p)*(p+1)=*p;*q=e;+L.length;return OK;int ListDelete_Sq(SqList if(iL.length)return ERROR;p=e=*p;q=L.elem+L.length-1;for(+p;p#include#define OK 1#define ERROR

10、0#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define ElemType inttypedef structint *elem,length,listsize;SqList;int InitList_Sq(SqList L.length=0;L.listsize=LIST_INIT_SIZE;return OK;int Load_Sq(SqList for(i=0;iL.length+1)return ERROR;ElemType *p,*q,*newbase;if(L.listsize=q;p-)*(p+1)=*p;*q=e;L.

11、length+;return OK;void MergeList(SqList La,SqList Lb,SqList i=j=1;k=0;InitList_Sq(Lc);La_len=ListLength(La);Lb_len=ListLength(Lb);while(itypedef struct LNodeint data; / 存储在结点中的数据struct LNode *next; / 指向下一结点的指针LNode,*LinkList;完整代码:#include#include#define OK 1#define ERROR 0#define LIST_INIT_SIZE 100#

12、define LISTINCREMENT 10#define ElemType int 11typedef structint *elem,length,listsize;SqList;int InitList_Sq(SqList if(!L.elem)printf(“NO1“);return ERROR;L.length=0;L.listsize=LIST_INIT_SIZE;return OK;int Load_Sq(SqList if(!L.length)printf(“This List is empty!n“);return ERROR;elsefor(i=0;i=L.listsiz

13、e)newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType);if(!newbase)printf(“NO2“);return ERROR;12L.elem=newbase;L.listsize+=LISTINCREMENT;q=for(p=p=q;p-)*(p+1)=*p;*q=e;L.length+;return OK;int swap(SqList for(i=0,j=n-1;ji;i+,j-)temp=L.elemi;L.elemi=L.elemj;L.elemj=temp;return

14、OK;int main()SqList T;int n,i;ElemType x;scanf(“%d“,InitList_Sq(T);for(i=1;i#include#define ERROR 0#define OK 1 #define ElemType inttypedef struct LNodeint data;struct LNode *next;LNode,*LinkList;int CreateLink_L(LinkList int i;ElemType e;L = (LinkList)malloc(sizeof(LNode);L-next = NULL; / 先建立一个带头结点

15、的单链表q = (LinkList)malloc(sizeof(LNode);q = L;for (i=0; inext;if( )printf(“The List is empty!“); / 请填空elseprintf(“The LinkList is:“);while( ) / 请填空printf(“%d “,p-data); / 请填空printf(“n“);return OK;14int LinkInsert_L(LinkList int a,n,i;ElemType x, e;printf(“Please input the init size of the linklist:n“

16、);scanf(“%d“,printf(“Please input the %d element of the linklist:n“, n);if( ) / 判断链表是否创建成功,请填空printf(“A Link List Has Created.n“);LoadLink_L(T);while(1)printf(“1:Insert elementn2:Delete elementn3:Load all elementsn0:ExitnPlease choose:n“);scanf(“%d“,switch(a)case 1: scanf(“%d%d“,if( ) printf(“Insert

17、 Error!n“); / 判断 i 值是否合法,请填空else printf(“The Element %d is Successfully Inserted!n“, x); break;case 2: scanf(“%d“,if( ) printf(“Delete Error!n“); / 判断 i 值是否合法,请填空else printf(“The Element %d is Successfully Deleted!n“, e);break;case 3: LoadLink_L(T);break;15case 0: return 1;测试样例格式说明:根据菜单操作:1、输入 1,表示要

18、实现插入操作,紧跟着要输入插入的位置和元素,用空格分开2、输入 2,表示要实现删除操作,紧跟着要输入删除的位置3、输入 3,表示要输出顺序表的所有元素4、输入 0,表示程序结束完整代码:#include#include#define ERROR 0#define OK 1#define ElemType int typedef struct LNodeint data;struct LNode *next;LNode,*LinkList;int CreateLink_L(LinkList int i;ElemType e;L=(LinkList)malloc(sizeof(LNode);L-n

19、ext=NULL;q=(LinkList)malloc(sizeof(LNode);q=L;for(i=0;idata=e;p-next=q-next;q-next=p;q=q-next;16return OK;int LoadLink_L(LinkList if(!p)printf(“The List is empty!“);elseprintf(“The LinkList is:“);while(p)printf(“%d “,p-data);p=p-next;printf(“n“);return OK;int LinkInsert_L(LinkList int j=0;while(pj+;

20、if(!p|ji-1)return ERROR;s=(LinkList)malloc(sizeof(LNode);s-data=e;s-next=p-next;p-next=s;return OK;int LinkDelete_L(LinkList int j=0;while(p-next17j+;if(!(p-next)|jnext;p-next=q-next;e=q-data;free(q);return OK;int main()LinkList T;int a,n,i;ElemType x,e;printf(“Please input the init size of the link

21、list:n“);scanf(“%d“,printf(“Please input the %d element of the linklist:n“,n);if(CreateLink_L(T,n)printf(“A Link List Has Created.n“);LoadLink_L(T);while(1)printf(“1:Insert elementn2:Delete elementn3:Load all elementsn0:ExitnPlease choose:n“);scanf(“%d“,switch(a)case 1:scanf(“%d%d“,if(!LinkInsert_L(

22、T,i,x)printf(“Insert Error!n“);elseprintf(“The Element %d is Successfully Inserted!n“,x);break;case 2:scanf(“%d“,if(!LinkDelete_L(T,i,e)printf(“Delete Error!n“);elseprintf(“The Element %d is Successfully Deleted!n“,e);break;case 3:LoadLink_L(T);break;case 0:return 1;18题目 5:设计一个算法将两个非递减有序链表 A 和 B 合并成

23、一个新的非递减有序链表 C。本题不提供代码,请同学们独立完成,所需子函数参考题目 4 完成的内容。测试样例格式说明:键盘输入第一行:单链表 A 的元素个数第二行:单链表 A 的各元素(非递减) ,用空格分开第三行:单链表 B 的元素个数第四行:单链表 B 的各元素(非递减) ,用空格分开正确输出第一行:单链表 A 的元素列表第二行:单链表 B 的元素列表第三行:合并后单链表 C 的元素列表测试样例:键盘输入612 24 45 62 84 96415 31 75 86正确输出List A:12 24 45 62 84 96 List B:15 31 75 86 List C:12 15 24 3

24、1 45 62 75 84 86 96 完整代码:#include#include#define ERROR 0#define OK 1#define ElemType inttypedef struct LNodeint data;struct LNode *next;LNode,*LinkList;int CreateLink_L(LinkList int i;ElemType e;L=(LinkList)malloc(sizeof(LNode);L-next=NULL;q=(LinkList)malloc(sizeof(LNode);q=L;for(i=0;idata=e;p-next=

25、q-next;q-next=p;q=q-next;return OK;int LoadLink_L(LinkList if(!p)printf(“The List is empty!“);elsewhile(p)printf(“%d “,p-data);p=p-next;printf(“n“);return OK;void MergeList_L(LinkList pa=La-next;pb=Lb-next;Lc=pc=La;while(papc=pa;pa=pa-next;elsepc-next=pb;pc=pb;pb=pb-next;pc-next=pa?pa:pb;free(Lb);in

26、t main()LinkList La,Lb,Lc;int n;scanf(“%d“,CreateLink_L(La,n);printf(“List A:“);LoadLink_L(La);scanf(“%d“,CreateLink_L(Lb,n);printf(“List B:“);LoadLink_L(Lb);MergeList_L(La,Lb,Lc);printf(“List C:“);LoadLink_L(Lc);return 0;题目 6:设有一线性表 A=(a 0,a1,., ai,.an-1),其逆线性表定义为 A=( an-1,., ai,.,a1, a0),设计一个算法,将链

27、式线性表逆置,要求线性表仍占用原线性表的空间。本题不提供代码,请同学们独立完成,所需子函数参考题目 4 完成的内容。测试样例格式说明:键盘输入第一行:输入 n,表示单链表的元素个数第二行:输入单链表的各元素,用空格分开正确输出第一行:输出单链表逆置前的元素列表第二行:输出单链表逆置后的元素列表21测试样例:键盘输入832 97 54 65 35 84 61 75正确输出The List is:32 97 54 65 35 84 61 75 The turned List is:75 62 84 35 65 54 97 32 完整代码:#include#include#define OK 1#d

28、efine ERROR 0#define ElemType int typedef struct LNodeint data;struct LNode *next;LNode,*LinkList;int CreateLink_L(LinkList int i;ElemType e;L=(LinkList)malloc(sizeof(LNode);L-next=NULL;q=(LinkList)malloc(sizeof(LNode);q=L;for(i=0;idata=e;p-next=q-next;q-next=p;q=q-next;return OK;int LoadLink_L(Link

29、List if(!p)printf(“The List is Empty!“);elsewhile(p)printf(“%d “,p-data);p=p-next;printf(“n“);return OK;22int inversion(LinkList L-next=NULL;while(p)q=p-next;p-next=L-next;L-next=p;p=q;return OK;int main()LinkList T;int n;scanf(“%d“,CreateLink_L(T,n);printf(“The List is:“);LoadLink_L(T);inversion(T)

30、;printf(“The turned List is:“);LoadLink_L(T);return 0;(三 ) 实验报告(1) 本实验所有题目要求在 JudgeOnline 上提交通过。(2) 实验报告针对以上所有实验内容。(3) 实验目的主要是阐述本实验需要掌握的知识要点。(4) 实验总结主要是对实验内容的掌握及理解程序作一个归纳性的叙述。(5) 对于思考题进行分析和思考,并做出相应的结论。(6) 本次实验报告可以在堂下完成。23实验二 堆栈(一 ) 实验目的(1) 理解堆栈的结构及操作特点(2) 实现堆栈的 PUSH、POP 等基本操作算法(3) 熟练掌握入栈、出栈时栈顶指针的变化情

31、况(4) 掌握堆栈的实际应用(二 ) 实验内容1. 顺序栈的基本操作题目 1:创建一个空的顺序栈,并实现栈的入栈、出栈、返回栈的长度、返回栈顶元素、栈的遍历等基本算法。请将下面的程序补充完整。#include #include #define OK 1#define ERROR 0#define STACK_INIT_SIZE 100 / 存储空间初始分配量#define STACKINCREMENT 10 / 存储空间分配增量typedef int SElemType; / 定义栈元素类型typedef int Status; / Status 是函数的类型,其值是函数结果状态代码,如 OK

32、 等struct SqStackSElemType *base; / 在栈构造之前和销毁之后,base 的值为 NULLSElemType *top; / 栈顶指针int stacksize; / 当前已分配的存储空间,以元素为单位; / 顺序栈Status InitStack(SqStack p = /请填空if( )printf(“The Stack is Empty!“); /请填空elseprintf(“The Stack is: “);p-;while( ) /请填空printf(“%d “, *p);/请填空printf(“n“);return OK;int main()int a

33、;SqStack S;SElemType x, e;if( ) / 判断顺序表是否创建成功,请填空printf(“A Stack Has Created.n“);while(1)printf(“1:Push n2:Pop n3:Get the Top n4:Return the Length of the Stackn5:Load the Stackn0:ExitnPlease choose:n“);scanf(“%d“,switch(a)case 1: scanf(“%d“, if( ) printf(“Push Error!n“); / 判断 Push 是否合法,请填空else print

34、f(“The Element %d is Successfully Pushed!n“, x); break;case 2: if( ) printf(“Pop Error!n“); / 判断 Pop 是否合法,请填空else printf(“The Element %d is Successfully Poped!n“, e);break;case 3: if( )printf(“Get Top Error!n“); / 判断 Get Top 是否合法,请填空else printf(“The Top Element is %d!n“, e);25break;case 4: printf(“T

35、he Length of the Stack is %d!n“, ); /请填空break;case 5: /请填空break;case 0: return 1;测试样例格式说明:根据菜单操作:1、输入 1,表示要实现 Push 操作,紧跟着输入要 Push 的元素2、输入 2,表示要实现 Pop 操作3、输入 3,返回栈顶元素4、输入 4,返回栈的元素个数5、输入 5,表示从栈顶到栈底输出栈的所有元素6、输入 0,表示程序结束完整代码:#include#include#include#define OK 1#define ERROR 0#define STACK_INIT_SIZE 100#

36、define STACKINCREMENT 10typedef int SElemType;typedef int Status;struct SqStackSElemType *base;SElemType *top;int stacksize;Status InitStack(SqStack if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;Status Push(SqStack if(S.base)26return ERROR;S.top=S.base+S.stacksize;S.stac

37、ksize+=STACKINCREMENT;*S.top+=e;return OK;Status Pop(SqStack e=*-S.top;return OK;Status GetTop(SqStack S,SElemType e=*(S.top-1);return OK;int StackLength(SqStack S)int i=0;while(S.top!=S.base)i+;S.top-;return i;Status StackTraverse(SqStack S)SElemType *p=(SElemType*)malloc(sizeof(SElemType);p=S.top;

38、if(S.top=S.base)printf(“The Stack is Empty!“);elseprintf(“The Stack is:“);p-;S.base-;while(p!=S.base)printf(“% d“,*p);p-;printf(“n“);return OK;int main()int a;SqStack S;27SElemType x,e;if(InitStack(S)printf(“A Stack Has Created.n“);while(1)printf(“1:Pushn2:Popn3:Get the Topn4:Return the Length of th

39、e Stackn5:Load the Stackn0:ExitnPlease choose:n“);scanf(“%d“,switch(a)case 1:scanf(“%d“,if(!Push(S,x)printf(“Push Error!n“);elseprintf(“The Element %d is Successfully Pushed!n“,x);break;case 2:if(!Pop(S,e)printf(“Pop Error!n“);elseprintf(“The Element %d is Successfully Poped!n“,e);break;case 3:if(!G

40、etTop(S,e)printf(“GetTop Error!n“);elseprintf(“The Top Element is %d!n“,e);break;case 4:printf(“The Length of the Stack is %d!n“,StackLength(S);break;case 5:StackTraverse(S);break;case 0:return 1;2. 栈的应用题目 2:利用顺序栈的基本操作算法,编写满足下列要求的数制转换程序:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。测试样例格式说明:键盘输入第一行:输入一个非负的十进制整数正确输

41、出第一行:与输入等值的八进制数测试样例第一组自测数据 第二组自测数据键盘输入 键盘输入15 38正确输出 正确输出17 46完整代码:#include28#include#define ERROR 0#define OK 1#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef int Status;struct SqStackSElemType *base;SElemType *top;int stacksize;Status InitStack(SqStack if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;Status Push(SqStack if(S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top+=e;return OK;Status Pop(SqStack e=*-S.top;return OK;Status StackEmpty(SqStack elsereturn 1;int main()int N,e;SqStack S;

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报