1、数据结构课设摘要“数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。它较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。数据结构的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。为了更好地学习,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使我们深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表
2、,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。关键字:链表 ; 邻接距阵; 遍历;目录设计题目3设计目的4设计程序5设计总结16设计心得17参考资料18致谢19设计题目1、二叉树的周游(1) 目的掌握二叉树的二叉链表存贮结构。掌握栈的基本运算实现。掌握二叉树的先序、中序、后序三种周游的算法实现。(2) 设计内容和要求对任意给定的二叉树(顶点数自定)建立它的二叉链表存贮结构,并利用栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现二叉树的先序、中序、后序三种周游
3、,输出三种周游的结果2、图的深度周游(1) 目的掌握图的邻接表存贮结构。掌握堆栈的基本运算实现。掌握图的邻接表的算法实现。掌握图的深度优先搜索周游算法实现。(2) 设计内容和要求对任意给定的图(顶点数和边数自定),建立它的邻接表并输出,然后利用堆栈的五种基本运算(清空堆栈、压栈、弹出、取栈顶元素、判栈空)实现图的深度优先搜索周游。3、joseph环(1) 目的检验对链表结构及算法的掌握程度。(2) 设计内容和要求编号是1,2,,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的
4、人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?要求:输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。输出形式:建立一个输出函数,将正确的输出序列。设计目的:通过本课程设计集中性的编程训练,培养学生上机动手能力,巩固数据结构课程学习的内容,使学生系统的掌握如何将客观实际问题与计算机的
5、算法对应起来,如何将客观信息与数据的逻辑结构和存储结构对应起来的方法。为后续各门计算机课程的学习打下坚实基础。图的深度优先遍历 深度优先搜索(Depth-First Search)遍历类似于树的先根遍历,是树的先根遍历的推广。其基本思想如下:假定以图中某个顶点vi为出发点,首先访问出发点,然后选择一个vi的未访问过的邻接点vj,以vj为新的出发点继续进行深度优先搜索,直至图中所有顶点都被访问过。显然,这是一个递归的搜索过程。 现以图5-3-1中G为例说明深度优先搜索过程。假定v0是出发点,首先访问v0。因v0有两个邻接点v1、v2均末被访问过,可以选择v1作为新的出发点,访问v1之后,再找v1
6、的末访问过的邻接点。同v1邻接的有v0、v3和v4,其中v0已被访问过,而v3、v4尚未被访问过,可以选择v3作为新的出发点。重复上述搜索过程,继续依次访问v7、v4 。访问v4之后,由于与v4相邻的顶点均已被访问过,搜索退回到v7。由于v7、v3和v1都是没有末被访问的邻接点,所以搜索过程连续地从v7退回到v3,再退回v1,最后退回到v0。这时再选择v0的末被访问过的邻接点v2,继续往下搜索,依次访问v2、v5和v6,止此图中全部顶点均被访问过。遍历过程见图5-3-1(b),得到的顶点的访问序列为:v0 v1 v3 v7 v4 v2 v5 v7。(a)无向图G (b) G的深度优先搜索过程图
7、5-3-1 深度优先搜索遍历过程示例设计程序如下#include #include #define INFINITY 32767#define MAX_VEX 20 /最大顶点个数 bool *visited; /访问标志数组 /图的邻接矩阵存储结构typedef struct char *vexs; /顶点向量 int arcsMAX_VEXMAX_VEX; /邻接矩阵 int vexnum,arcnum; /图的当前顶点数和弧数Graph; /图G中查找元素c的位置int Locate(Graph G,char c) for(int i=0;iG.vexnum;i+) if(G.vexsi
8、=c) return i; return -1; /创建无向网void CreateUDN(Graph &G) int i,j,w,s1,s2; char a,b,temp; printf(输入顶点数和弧数:); scanf(%d%d,&G.vexnum,&G.arcnum); temp=getchar(); /接收回车 G.vexs=(char *)malloc(G.vexnum*sizeof(char); /分配顶点数目 printf(输入%d个顶点.n,G.vexnum); for(i=0;iG.vexnum;i+) /初始化顶点 printf(输入顶点%d:,i); scanf(%c,
9、&G.vexsi); temp=getchar(); /接收回车 for(i=0;iG.vexnum;i+) /初始化邻接矩阵 for(j=0;jG.vexnum;j+) G.arcsij=INFINITY; printf(输入%d条弧.n,G.arcnum); for(i=0;i=0 & kG.vexnum) /k合理 for(int i=0;i=0 & i=0 & jG.vexnum) /i,j合理 for(int k=j+1;kG.vexnum;k+) if(G.arcsik!=INFINITY) return k; return -1; /深度优先遍历void DFS(Graph G,
10、int k) int i; if(k=-1) /第一次执行DFS时,k为-1 for(i=0;i=0;i=NextVex(G,k,i) if(!visitedi) DFS(G,i); /对k的尚未访问的邻接顶点i递归调用DFS /主函数void main() int i; Graph G; CreateUDN(G); visited=(bool *)malloc(G.vexnum*sizeof(bool); printf(n深度优先遍历: ); for(i=0;iMAX_NODE) printf(参数错误!n); return(0); for(i=1;idata = datai0; p-lch
11、ild = NULL; p-rchild = NULL; nodeorder = datai1; p-order = nodeorder; Addrnodeorder = p; if(nodeorder1) noderoot = nodeorder/2; if(nodeorder %2 = 0) Addrnoderoot-lchild = p; else Addrnoderoot-rchild = p; else head = p; printf(BTree%d = %ct,p-order,p-data); /free(p); return(head);/*function FirstOrde
12、rAccess0()功能:实现二叉树的前序遍历二叉树前序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止,依次访问所经过的节点,同时所经节点的地址进栈; 当找到没有左孩子的节点时,从栈顶退出该节点的双亲的右孩子,此时,此节点的左子树已访问完毕; 在用上述方法遍历该节点的右子树,如此重复到栈空为止。*/void FirstOrderAccess0(BTree * header) BTree * stackMAX_NODE; BTree *p; int top; top = 0; p = header; do while(p!=NULL) printf(BTree%d = %ct,
13、p-order,p-data);/访问节点P top = top+1; stacktop = p; p = p-lchild;/继续搜索节点P的左子树 if(top!=0) p = stacktop; top = top-1; p = p-rchild;/继续搜索节点P的右子树 while(top!=0)|(p!=NULL);/*function FirstOrderAccess1()功能:实现二叉树的前序遍历二叉树前序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止,依次访问所经过的节点,同时所经节点的非空右孩子进栈; 当找到没有左孩子的节点时,从栈顶退出该节点的双亲的右孩子
14、,此时,此节点的左子树已访问完毕; 在用上述方法遍历该节点的右子树,如此重复到栈空为止。*/void FirstOrderAccess1(BTree * header) BTree * stackMAX_NODE; BTree *p; int top; top = 0; p = header; do while(p!=NULL) printf(BTree%d = %ct,p-order,p-data); if(p-rchild!=NULL) stack+top = p-rchild; p = p-lchild; if(top!=0) p = stacktop-; while(top0)|(p!
15、=NULL);/*function MiddleOrderAccess()功能:实现二叉树的中序遍历二叉树中序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止,并将所经节点的地址进栈; 当找到没有左孩子的节点时,从栈顶退出该节点并访问它,此时,此节点的左子树已访问完毕; 在用上述方法遍历该节点的右子树,如此重复到栈空为止。*/void MiddleOrderAccess(BTree * header) BTree * stackMAX_NODE; BTree *p; int top; top = 0; p = header; do while(p!=NULL) stack+to
16、p = p;/节点P进栈 p = p-lchild; /继续搜索其左子树 if(top!=0) p = stacktop-;/节点P出栈 printf(BTree%d = %ct,p-order,p-data);/访问节点P p = p-rchild;/继续搜索其左子树 while(top!=0)|(p!=NULL);/*function LastOrderAccess()功能:实现二叉树的后序遍历二叉树后序遍历的思想: 从根节点开始,沿左子树一直走到没有左孩子的节点为止,并将所经节点的地址第一次进栈; 当找到没有左孩子的节点时,此节点的左子树已访问完毕;从栈顶退出该节点,判断该节点是否为第一
17、次进栈,如是,再将所经节点的地址第二次进栈,并沿该节点的右子树一直走到没有右孩子的节点为止,如否,则访问该节点;此时,该节点的左、右子树都已完全遍历,且令指针p = NULL; 如此重复到栈空为止。*/void LastOrderAccess(BTree * header) BTree * stackMAX_NODE;/节点的指针栈 int countMAX_NODE;/节点进栈次数数组 BTree *p; int top; top = 0; p = header; do while(p!=NULL) stack+top = p;/节点P首次进栈 counttop = 0; p = p-lch
18、ild; /继续搜索节点P的左子树 p = stacktop-;/节点P出栈 if(counttop+1=0) stack+top = p;/节点P首次进栈 counttop = 1; p = p-rchild; /继续搜索节点P的左子树 else printf(BTree%d = %ct,p-order,p-data);/访问节点P p = NULL; while(top0);int main(int argc, char* argv) BTree * TreeHeader; printf(二叉树创建数据结果:n); TreeHeader = CreateBTree(TreeValue1,N
19、ODE_COUNT1-1); /TreeHeader = CreateBTree(TreeValue2,NODE_COUNT2-1); if (TreeHeader=0) printf(二叉树创建失败!n); return(0); else printf(n二叉树前序遍历结果:n); FirstOrderAccess1(TreeHeader); printf(n二叉树中序遍历结果:n); MiddleOrderAccess(TreeHeader); printf(n二叉树后序遍历结果:n); LastOrderAccess(TreeHeader); return 0; 3、joseph环:ty
20、pedef struct LNode int password; /密码 int No; /序号 struct LNode *next; /下一成员指针 member; /成员结构体 typedef int status; #define OVERFLOW -2 #define OK 1 #define ERROR 0 #include #include status CreateList_Circle(member *,int); status DeleteNode(member *); status main() int n,m; member *head=NULL,*p=NULL; /头
21、指针即首成员地址,遍历指针p printf (Please enter number of people:n); scanf (%d,&n); /总成员数 while (n=0) printf (n must be positive, please enter again:n); scanf (%d,&n); if(!CreateList_Circle(&head,n) /创建循环链表,返回头指针head return OVERFLOW; printf (Please enter initial m:n); scanf (%d,&m); /初始m while (m=2) /寻找出列成员 int
22、 i; m=(m%n=0)?n:m%n; /化简m值 for (i=1;inext; /p指向出列成员 printf (%dn,p-No); /输出出列成员序号 m=p-password; /修改m DeleteNode(&p); /删除链表中的出列成员 n-; /成员数自减 printf (%dn,p-No); /输出最后一个成员序号 return OK; status CreateList_Circle(member *p_head,int n) /此算法创建一个无头结点的循环链表,结点数n,*p_head返回链表头指针即首结点地址 int i; member *tail,*p; *p_head=(member *)malloc(sizeof(member); if (!(*p_head) return OVERFLOW; (*p_head)-No=1; /储存成员一序号 printf (Please enter password of No. 1:n); scanf (%d,&(*p_head)-password); /储存成员一密码 tail=*p_head; tail-next=NULL; for (i=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1