南阳理工学院_软件学院数据结构上机实验指导书全部答案.doc
《南阳理工学院_软件学院数据结构上机实验指导书全部答案.doc》由会员分享,可在线阅读,更多相关《南阳理工学院_软件学院数据结构上机实验指导书全部答案.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、南阳理工学院数据结构上机实验指导书(2011版) 答案(仅内供)软件学院软件工程教研室2011.3目 录实验1 线性表应用2实验2 栈和队列的应用14实验3 线性表应用27实验4 图论及其应用46实验5 查找59实验6 排序64实验1 线性表应用一、实验目的1. 了解和掌握线性表顺序存储和链式存储在计算机中的表示,基本操做在计算机中的实现。2. 能够利用线性表结构对实际问题进行分析建模,利用计算机求解。3. 能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。二、实验内容及步骤 1. 利用程序设计语言分别实现顺序表和链表的抽象数据类型。2. 掌握程序分文件(头文件和实
2、现文件)书写的方式。3. 分别用顺序表和链表实现课本算法2.2:合并两个非递减有序序列,并对其时间性能做出分析。l 顺序表的非递减数列合并实验2 栈和队列的应用一、实验目的1. 掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。2. 熟练掌握栈类型的两种实现方法。3. 熟练掌握循环队列和链队列的基本操作实现算法。二、实验内容及步骤 1. 用程序设计语言实现栈和队列的抽象数据类型。2. 在第一题的基础上完成以下选择:选择一:1) 设计并实现括号匹配算法。2) 用队列实现在屏幕上打印杨辉三角。选择二:分别用栈和队列实现迷宫问题求解。选择三:分别用栈和队列实现一个列车调度系统
3、。l 括号匹配算法。#include#include#include#include string.h return 0;int PushStack(LinkStack top, DataType e)/*进栈操作就是要在链表的第一个结点前插入一个新结点,进栈成功返回1*/LStackNode *p;/*定义指向第i个元素的前驱结点指针pre,指针p指向新生成的结点*/if(p=(LStackNode*)malloc(sizeof(LStackNode)=NULL)printf(内存分配失败!);exit(-1);p-data=e;/*指针p指向头结点*/p-next=top-next;top
4、-next=p;return 1;int PopStack(LinkStack top,DataType *e)/*删除单链表中的第i个位置的结点。删除成功返回1,失败返回0*/LStackNode *p; p=top-next; if(!p)/*判断链栈是否为空*/ printf(栈已空); q=p; p=p-next; free(q); int GetTop(LinkStack top,DataType *e)LStackNode *p; p=top-next; if(!p)/*判断链栈是否为空*/ printf(栈已空); return 0; *e=p-data;/*将出栈元素赋值给e*
5、/ return 1;void main() case :case :PushStack(S,*p+);break;case ):case :case :if(StackEmpty(S)elseGetTop(S,&e);printf(缺少右括号.n);int Match(DataType e,DataType ch)if(e=(&ch=)return 1;else if(e=&ch=)return 1;else if(e=&ch=)return 1;elsereturn 0;typedef struct QNodeDataType data;struct QNode* next;LQNode,
6、*QueuePtr;typedef structQueuePtr front;QueuePtr rear;LinkQueue;void InitQueue(LinkQueue *LQ) /*将返回1,否则返回0*/ return 1; else return 0;int EnterQueue(LinkQueue *LQ,DataType e)/*将元素e插入到链式队列LQ中,插入成功返回1*/ LQNode *s;LQ-rear=s;/*将队尾指针指向p*/ return 1;/int DeleteQueue(LinkQueue *LQ,DataType *e)/*删除链式队列中的队头元素,并
7、将该元素赋值给e,删除成功返回1,否则返回0*/ LQNode空*/return 0;elses=LQ.front-next;/*将指针p指向队列的第一个元素即队头元素*/*e=s-data;/*将队头元素赋值给e,取出队头元素*/return 1;/*出队操作。*/int DeleteQueue(LinkQueue *Q,DataType *x) /* 将队列Q的队头元素出队,并存放到x所指的存储空间中 */LQNode * p;if(Q-front=Q-rear)retu/*产生第中间n-2行的元素*/for(n=2;n=N;n+)/*产生第i行元素并入队,同时将第i-1行的元素保存在临时
8、数组中*/k=0;EnterQueue(&Q,1);/*第i行的第一个元素入队*/for(i=1;i=n-2;i+)/*利用队列中第i-1行元素产生第i行的中间i-2个元素并入队列*/DeleteQueue(&Q,&t);tempk+=t;/*将第i-1行的元素存入临时数组*/while(!QueueEmpty(Q)/*将最后一行元素存入临时数组*/DeleteQueue(&Q,&t);tempk+=t;if(QueueEmpty(Q)PrintArray(temp,k,N);void main()int n;printf(请输入要打印的行数:n=:);scanf(%d,&n);YangHui
9、Triangle(n);用栈实现迷宫问题求解#include #include #define OVERFLOW -1 #define MAX 100typedef struct int x; int y; int d; Data; typedef struct int pos; Data dataMAX; SNode,*Stack; Stack InitStack() Stack pStack; pStack=(Stack)malloc(sizeof(SNode); if(!pStack) if(pStack-pos=-1) exit(OVERFLOW); else pStack-pos-;
10、 Data GetTop(Stack pStack) revoid DisplayPath(Stack pStack) Data element; printf(The path is:n); while(!IsEmpty(pStack) element=GetTop(pStack); Pop(pStack); printf(The node is:(%d,%d)n,element.x,element.y); void MazePa int i,j,k,g,h; Stack pStack; Data element; pStack=InitStack(); mazex1y1=2; h=j+di
11、rectionk1; if(g=x2 & h=y2 & mazegh=0) Push(pStack,SetStackElem(i,j,k);Push(pStack,SetStackElem(x2,y2,k); DisplayPath(pStack); return; int i,j; printf(The maze is:n); for(i=0;i8;i+) for(j=0;j11;j+) printf(%2d,mazeij); printf(n);MazePath(maze,direction,1,1,6,9); 用队列实现迷宫问题求解#include#define r 64#define
12、m2 8#define n2 10int m=m2-2,n=n2-2;typedef structint x,y; /行列坐标int i,j,k,v,front,rear,x,y;int markm2n2;for(i=0;im2;i+)for(j=0;jn2;j+)marki j=0;printf(Please Input move arrayn);for(i=0;i8;i+)scanf(%d,%d,&movei .x,&movei .y);sq1.x=1;sq1.y=1;sq1.pre=0;front=1;rear=1;mark11=1; /标记入口以到达过while(front=rear)
13、x=sqfront.x;y=sqfront.y; /(x,y)为出发点for(v=0;v8;v+) /搜索(x,y)的8个相邻(i,j)是否可以到达for(i=1;i19;i+)printf(%3d,i);printf(n);for(i=1;i19;i+)printf(%3d,sqi .x);printf(n);for(i=1;i19;i+)printf(%3d,sqi .y);printf(n);for(i=1;i19;i+)printf(%3d,sqi .pre);printf(n);return(1); /成功返回front+; /出队,front 指向新的出发点 /队空,循环结束pri
14、ntf(There is no path! n);return(0); /迷宫没有路径返回main()int i,j;for(i=0;i10;i+)maze0i =1;maze7i =1;for(i=0;i8;i+)mazei 0=1;mazei 9=1;/*for(i=1;i7;i+)for(j=1;j9;j+)printf(%d %d,i,j);scanf(%d,&mazei j);*/maze11=0;maze12=1;maze13=0;maze14=1;maze15=1;mazprintf(n);for(i=0;i8;i+)for(j=0;j10;j+)printf(%d,mazei
15、j);printf(n);PATH(maze);分别用队列实现一个列车调度系统。实验3 树的应用一、实验目的1. 领会并理解二叉树的类型定义。2. 熟练掌握二叉树的主要特性,。3. 熟练掌握二叉树的各种遍历算法,并能灵活运用遍历算法实现二叉树的其它操作。4. 熟练掌握二叉树和树的各种存储结构及其建立的算法。5. 了递归算法的实现过程。二、实验内容及步骤 1. 实现二叉树的抽象数据类型。2. 构造一棵二叉树并用递归实现其先序、中序、后序遍历算法并验证。3. 用非递归算法实现二叉树的中序遍历。4. 给出一段报文和每个字符出现的概率,对其进行哈夫曼编码和解码。l 二叉树递归实现其先序、中序、后序遍历
16、算法并验证。#include#include#define MaxSize 50typedef int KeyType;typedef struct /*数据元素类型定义*/if(lowhigh)/*如果元素序列的长度大于1*/ pivot=Partition(L,low,high);/*将待排序序列L.rlow.high划分为两部分*/DispList2(*L,pivot,count);/*输出每次划分的结果*/count+;QSort(L,low,pivot-1);/*对左边的子表进行递归排序,pivot是枢轴位置*/QSort(L,pivot+1,high);/*对右边的子表进行递归排序
17、 */void QuickSort(SqList *L)/* 对顺序表L作快速排序*/ QSort(L,1,(*L).length);int i,n=10;SqList L;/*冒泡排序*/InitSeqList(&L,a,n);printf(冒泡排序前:);DispList(L);BubbleSort(&L,n);printf(冒泡排序结果:);DispList(L,n);/*快速排序*/InitSeqList(&L,a,n);printf(快速排序前:);DispList(L,n);QuickSort(&L,n);printf(快速排序结果:);DispList(L);void InitS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南阳 理工学院 软件 学院 数据结构 上机 实验 指导书 全部 答案
限制150内