收藏 分享(赏)

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

上传人:精品资料 文档编号:8351800 上传时间:2019-06-21 格式:DOC 页数:175 大小:697.50KB
下载 相关 举报
华南农业大学数据结构上机实验指导书及答案.doc_第1页
第1页 / 共175页
华南农业大学数据结构上机实验指导书及答案.doc_第2页
第2页 / 共175页
华南农业大学数据结构上机实验指导书及答案.doc_第3页
第3页 / 共175页
华南农业大学数据结构上机实验指导书及答案.doc_第4页
第4页 / 共175页
华南农业大学数据结构上机实验指导书及答案.doc_第5页
第5页 / 共175页
点击查看更多>>
资源描述

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营业执照举报