1、算法与数据结构课程设计报 告系 ( 院): 计算机科学学院 专业班级: 姓 名: 学 号: 指导教师: 一设计方案 由课程设计任务书,按照要求,需要设计 1.单链表的基本操作与应用。2.栈的基本操作及应用。3.数组的基本操作与应用。4.树的基本操作与应用。5.图的基本操作与应用。由于总的框架和单链表的实现已经给出,剩下的就是把后面 4 个基本操作及应用实现,将其功能函数添加进去,通过选择调用这些功能函数实现要求。1. 单链表已经给出,不需要设计写出功能函数,只需要将代码整理便可实现要求。例如创建单链表:void OnCreateList_L()int n;cout n;CreateList_L
2、(L,n); /已给函数其他功能如插入,查找,删除均可按上面方法调用功能函数,2 栈的基本操作及应用。首先按照要求,创建栈结构体,包含数据域和指针域。将要实现的功能对应的功能函数写出。要实现的功能是进栈 Push(),出栈 Pop(),取栈顶元素 OnGetTop()。在对应功能选择项下面来调用这些函数。3稀疏矩阵的压缩存储及应用。创建三元组 Triple 结构体,包含行列下标 i,j,元素e。创建矩阵 TSMatrix 结构体,包含 Triple 类型 dataMAXSIZE+1,矩阵矩阵的行数 mu,列数 nu 和非零元个数 tu。实现 CreateSMatrix()函数创建矩阵,Prin
3、tSMatrix()函数显示已创建的矩阵。在对应功能选择项下面来调用这些函数。4. 树的基本操作与应用。创建 BiTNode 结构体,包含 char 类型 data,结构体类型BiTNode 指针*left,*right。实现 InitBiTree(),CreateBiTree(),Visit()对元素操作的的应用函数,先序遍历 PreOrderTraverse()对每个数据元素调用函数 Visit。中序遍历InOrderTraverse (),后序遍历 PostOrderTraverse(),计算树的深度 BiTreeDepth(),计算叶子节点个数 Leave()返回左右子树为空的个数,查
4、找双亲 BiTNode* Parent(),查找兄弟 OnBrother()调用 Parent()找到双亲下面左右子树。实现这些函数便可完成基本操作。将三个遍历函数的调用放在 OnTraverse()里,实现一次性调用遍历。同时,在对应功选择项下面来调用这些函数。5. 图的基本操作与应用。图的操作都是以两种存储结构为基础的,邻接矩阵存储结构和邻接表存储结构。如4种图(无向图,无向网,有向图,有向网)的创建,其他的操作都是在四种图创建后才开始进行的。所以,首先必须理解两种存储结构的定义。图的邻接矩阵存储结构即图的数组表示法。创建关于弧ArcNode结构体体,intadjvex;struct*ne
5、xtarc;Infotype *info;ArcNode。创建结VNode typedef struct VNode VertexType data; ArcNode* firstarc; VNode,AdjListMAX_VERTEX_NUM;创建ALGraph结构体typedef struct AdjList vertices; int vernum, arcnum; int kind; ALGraph所有结构体已经创建完成,接下来就是实现功能函数, CreatUDG_ALG(ALGraph CreatUDN_ ALG ALGraph CreatDN_ALG(ALGraph CreatDN
6、_M(MGraph DFSTraverse(ALGraph ALG, Status(*Visit)(int v)DFS(ALGraph ALG, int v)FistAdjVex(ALGraph ALG, int v)NextAdjVex(ALGraph ALG, int v, int w)BFSTraverse(ALGraph ALG, Status(*Visit)(int v)TopologicalSort(ALGraph int count,k,i;ArcNode *p;char indegreeMAX_VERTEX_NUM;FindInDegree(G, indegree); / 对各
7、顶点求入度 indegree0vernum-1InitStack(S);for (i=0; inextarc) k = p-adjvex; / 对 i 号顶点的每个邻接点的入度减 1if (!(-indegreek) Push(S, k); / 若入度减为 0,则入栈 if (countnextarc) k = p-adjvex; / 对 j 号顶点的每个邻接点的入度减 1if (-indegreek = 0) Push(S, k); / 若入度减为 0,则入栈if (vej+p-info vek) vek = vej+p-info;/for *(p-info)=dut()/whileif (
8、countnextarc) k=p-adjvex; dut=p-info; /dutif (vlk-dut nextarc) k=p-adjvex;dut=p-info; ee = vej; el = vlk-dut;tag = (ee=el) ? * : ;printf(j, k, dut, ee, el, tag); / 输出关键活动return OK; / CriticalPathvoid DFSTraverse(Graph G, Status (*Visit)(int v) / 对图 G 作深度优先遍历。int v;VisitFunc = Visit; / 使用全局变量 VisitFu
9、nc,使 DFS 不必设函数指针参数for (v=0; vG.vexnum; +v) visitedv = false; / 访问标志数组初始化for (v=0; vG.vexnum; +v) if (!visitedv) DFS(G, v); / 对尚未访问的顶点调用 DFSbool visitedMAX_VERTEX_NUM; / 访问标志数组Status (* VisitFunc)(int v); / 函数变量void DFS(Graph G, int v) / 从第 v 个顶点出发递归地深度优先遍历图 G。int w;visitedv = true; VisitFunc(v); / 访
10、问第 v 个顶点for (w=FirstAdjVex(G, v); w!=-1; w=NextAdjVex(G, v, w)if (!visitedw) / 对 v 的尚未访问的邻接顶点 w 递归调用 DFSDFS(G, w);四测试(运行结果图)1单链表(创建、插入、显示、删除)2栈(进栈、获取栈顶、出栈)3稀疏矩阵4二叉树(创建、遍历、查找双亲、查找兄弟)5图的基本操作与应用(遍历、拓扑排序、最小生成树、最短路径、关键路径)四 结论 一、有待完善在执行程序时,我做了判断机制,比如在选择单链表的操作时,没有先选择创建单链表选项时,先选择插入、删除和显示时,输出“请输入 1 创建单链表” ,程
11、序不会死掉。增加了程序的可靠性和便捷性。但是,在输入数据元素的,必须按照规定的方式输入,一旦未按规定方式输入,程序就会运行出错,且没有错误提示。可在此程序的基础之上设计错误处理机制,使程序更加完善,更加具有可用性。二、代码繁琐程序代码冗长:由于使用的是结构体设计,代码可重用率较低。如果使用面向对象的设计方法,可用到继承大方法,使程序更加简洁,增加了代码可复用性和可读性。五难点与收获 一、难点(1)课设的难点一在于自己知识的缺乏和对数据结构这门课的学习的不精。一看到课设的题目,立马就有一种书到用时方恨少的感觉,平常在学习数据结构时,没有将课本上的代码一一上机实践。导致在课设时写代码时只能对着书本
12、上代码慢慢敲。我想,如果完全独立自主不借助书本,这次的课设是完成不了的。说到底,还是自己学艺不精,学习不刻苦。这是本次课设的主要难点。(2)课设的难点二在于编程、调试、解决问题能力不足,编程时出现的错误和问题,并不能完全的解决掉。即使解决了也需要花费相对较长的时间。这在有限的时间里显然是不合适的。所以通过本次课设还要提高自己的编程调试能力。二、收获通过本次课设,我有以下几点收获(1)掌握并运用程序语言是编写程序的基础。我总结了这次课设,为什么有一些算法我知道实现原理,却写不出完整的程序?我想这是对编程语言的掌握还不够扎实、到位,还不明白或熟悉某些语法的运用及功能。我想,一定得花时间看看 C、C
13、+ 等程序设计语言,这才是最基础的,必须牢固掌握,并且要熟悉用法。这才有利于今后更好的学习更深层次的语言,写出好的程序。(2)认识到上机实践的重要性。一定要上机实践,培养并提高自己的实践能力。仅仅看懂书本上的算法是完全不够的,看懂并不代表会写。即使能够写出来,也不一定运行的成功,而且还会有报错的情况。所以,还是自几的编程能力有待提高。如果一个程序员不会写代码,我想这对我踏入社会是非常不利的。编程是一门实践性极强的专业,有扎实的编程能力、严谨的编程思想和优秀的编程成果才是我们的最高目标,才能真正将所学到的知识、书本的知识运用于实践。这恰恰也是我所缺乏的。(3)要有一种积极的态度。自己编程时经常会出现错误而导致程序无法运行,出现错误的原因有编程能力问题,更有自己的不够细心,这给自己带来了许多的麻烦,也容易让人失去信心。比如在做图的时候,错误是比较多的,所以,我一步一步的调试,请教同学,最终还是可以运行了。所以,有一颗积极的心态,尤为重要。(4)要细心,严谨。编程时很多的错误都是由自己的不细心导致的,这会影响进度,也会影响自己的心情。细心,严谨,积极的态度这不仅对于程序设计,任何事都应该如此。(5)通过本次课设还加强和巩固了我对数据结构知识点的记忆,也提高了自己上机实践、程序设计、编程调试能力。指导老师意见:成绩: 教师签名: 年 月 日