版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 课程设计综合成绩评定设计题目一: 二 叉 排 序 树 设计题目二: 最 短 路 径 问 题 设计题目三: 考核项目分值ac得分设计情况(共70分)设计工作量与难度20设计工作量大与设计有一定难度设计工作量与难度一般,基本达到了要求设计方案15设计方案正确、合理设计方案较正确、基本合理,但不是最优设计完成情况35完成了选题的设计内容,设计功能完整,相关算法设计正确,程序结果正确、直观性好基本完成了选题的设计内容及主要选题功能,相关算法设计基本正确,程序结果正确设计报告(共15分)报告组织结构及内容10内容组织及结构合理、内容充实、层次清晰、图表得当内容组织及结构较合理、内容较充实、层次较清晰、
2、图表应用基本得当报告排版格式5格式规范,完全符合要求格式基本规范,基本符合要求设计态度(共15分)15设计态度认真、积极设计态度比较认真综合得分课程设计综合成绩(折合为优、良、中、及格与不及格计)其它说明:目 录1.二叉排序树11.1 问题描述11.2 设计方案与概要设计21.3 详细设计41.4 程序运行说明与结果112.最短路径问题132.1 问题描述132.2 设计方案与概要设计162.3 详细设计172.4 程序运行说明与结果273.总结与分析32数据结构课程设计1. 二叉排序树1.1 问题描述知二叉排序树的二叉链表存储结构的类型定义如下:typedef struct node int
3、 data; /用整数表示一个结点的名 struct node *lchild,*rchild; /左右指针域bstnode,*bstree; (1)键盘输入一个元素序列创建一棵如图(1)的二叉排序树,并输出该二叉排序树的中序遍历序列;45556053402370371224 图(1) (2)在图(1)中所得的二叉排序树中插入一个值为58的结点,输出它的中序遍历序列; (3)在题(2)中所得的二叉排序树中删除值为45的结点,输出它的中序遍历序列;(4)我们知道教材中p220给出的二叉排序树的删除操作算法中,是用左子树中最右下结点来替代要被删除的结点(即为要被删除结点的中序前驱),也可以用右子树
4、中最左下结点来替代要被删除的结点(即为要被删除结点的中序后继),根据此思路修改p220算法在写一个删除操作,并利用修改后的删除算法删除图(1)中二叉排序树的值为45的结点,输出它的中序遍历序列;(5)利用题(2)中所得的二叉排序树的所有叶子结点构造一个带头结点的单链表l。要求不能破坏这棵二叉排序树。所得的单链表l元素递增,并输出单链表l。(6)设计算法将图(1)的二叉排序树的左右子树进行交换。最后输出所得到的二叉树的中序遍历序列。45556053402370371224所得二叉排序树如图所示: 图(2)(7)用计算法统计并输出图(1)中所得的二叉排序树中只有一个孩子结点的结点个数。(8)由图(
5、1)的二叉排序树,用计算法并编写程序输出结点40的所有祖先结点。1.2 设计方案与概要设计1. 二叉排序树应用的存储结构 typedef struct node / 二叉排序树的存储结构 int data; struct node *lchild,*rchild; bstnode,*bstree; typedef struct lnode /单链表的存储结构 int data; struct lnode *next; lnode,*linklist;二叉排序树的设计用到了单链表l。单链表l主要用于题(5)的设计,用来存储图(1)的二叉排序树中所有叶子结点,并将其输出。2.方案设计本方案设计主要
6、应用二叉树的性质。创建空二叉排序树t,再输入图(1)中的元素后向t插入所有元素,在插入时比根结点小的放在树的左子树,比根结点大则放在树的右子树,同时树的左右子树也要遵循这个规律。在删除操作中当只有一个结点时可直接删除,否则用左子树中最右下结点来替代要被删除的结点进行删除操作,亦可用右子树中最左下结点来替代要被删除的结点进行删除操作,可视为同种删除方法。寻找叶子节点时主要采用递归方法,从根结点开始遍历当发现结点无左右孩子时则得到当前的结点元素并用尾插法将其放入单链表中直至遍历完毕,最后输出单链表l。在二叉排序树进行左右子树交换时新创建树r避免对树t的干扰,把树t复制给树r,调用树r采用递归法和交
7、换法进行左右子树的交换。寻找只有一个孩子结点的结点个数时也是采用递归法,从根结点开始遍历当发现结点只有左孩子或右孩子是则计数加1直至遍历完毕,输出最后的计数。在取某元素的祖先结点时,从根结点与该元素对比并寻找该元素,其所走路径即为该元素的祖先结点路径,因此用数组将该路径存储起来,并将其输出。3. 设计程序的整体功能结构(整体算法的描述)void create(bstree &t):用来创建树,输入树的所有元素;int search(bstree t,int k,bstree &q):对树进行查找,判断元素是否存在树中;void insert(bstree &t,int e):对树进行元素插入;
8、void deletebst(bstree &t,int k,int &e):删除中序前驱,用左子树中最右下结点来替代要被删除的结点;void deletebst1(bstree &t,int k,int &e):删除中序后驱,用右子树中最左下结点来替代要被删除的结点;void outtree(bstree &t):中序遍历函数,并输出t;int createlist(linklist &l): 创建单链表l并为空;int insertlist(linklist &l,int e):用尾插法向单链表插入元素;void leaf(bstree t,linklist &l):得到树t的叶子节点,并
9、得到其结点; void outlist(linklist l):输出点链表; bstree copy(bstree t):创建树r,把树t复制给r;void create1(bstree &r):把树r的左右子树进行交换; int jie(bstree r):计算只有一个孩子结点元素的个数; void bstree(bstree r,int e):得到某元素的祖先结点并将其输出; int main():主函数; 1.3 详细设计 #include #include #define true 1#define false 0#define max 20 typedef struct node /
10、 二叉排序树的存储结构 int data; /用整数表示一个结点的名 struct node *lchild,*rchild; /左右指针域bstnode,*bstree; typedef struct lnode /单链表的存储结构 int data; struct lnode *next; lnode,*linklist;创建树函数:void create(bstree &t) int e; bstree q; t=null; printf(请输入二叉树的根:); scanf(%d,&e); printf(依次输入个结点以-1结束:n); while(e!=-1) if(!search(t
11、,e,q) insert(t,e); scanf(%d,&e); 树元素查找函数:int search(bstree t,int k,bstree &q) bstree p,f; p=t; f=null; if(p=null) return false; while(p) if(k=p-data) q=p; return true; else if(kdata) f=p; p=p-lchild; else f=p; p=p-rchild; q=f; return false; 对树进行插入函数:void insert(bstree &t,int e) bstree p,q; if(t=null
12、) p=(bstree)malloc(sizeof(bstnode); p-data=e; p-lchild=p-rchild=null; t=p; else if(!search(t,e,q) p=(bstree)malloc(sizeof(bstnode); p-data=e; p-lchild=p-rchild=null; if(edata) q-lchild=p; else q-rchild=p; 删除函数(删除中序前驱): void deletebst(bstree &t,int k,int &e) bstree q,s,v,t; q=t; v=null; while(q) if(k
13、=q-data) break; else if(kdata) v=q; q=q-lchild; else v=q; q=q-rchild; if(!q) printf(我要删除的数字不存在。n); return; e=q-data; if(q-lchild&q-rchild) s=q-lchild; v=q; while(s-rchild) v=s; s=s-rchild; q-data=s-data; q=s; if(q-lchild) t=q-lchild; else t=q-rchild; if(q=t) t=t; else if(q=v-lchild) v-lchild=t; else
14、 v-rchild=t; free(q); 删除函数(删除中序后继): void deletebst1(bstree &t,int k,int &e) bstree q,s,v,t; q=t; v=null; while(q) if(k=q-data) break; else if(kdata) v=q; q=q-lchild; else v=q; q=q-rchild; if(!q) printf(你要删除的数字不存在。n); return; e=q-data; if(q-lchild&q-rchild) s=q-rchild; v=q; while(s-lchild) v=s; s=s-l
15、child; q-data=s-data; q=s; if(q-rchild) t=q-rchild; else t=q-lchild; if(q=t) t=t; else if(q=v-rchild) v-rchild=t; else v-lchild=t; free(q); 中序遍历函数: void outtree(bstree &t) if(t) outtree(t-lchild); printf(%4d,t-data); outtree(t-rchild); 创建单链表: int createlist(linklist &l) /单链表初始化 l=(linklist)malloc(si
16、zeof(lnode); if(!l) return false; l-next=null; return true; 单链表插入函数: int insertlist(linklist &l,int e) /向单链表插入元素 lnode *p=l,*q; q=(lnode *)malloc(sizeof(lnode); if(!q) return false; while(p-next!=null) p=p-next; q-data=e; q-next=p-next; p-next=q; 叶子结点函数: void leaf(bstree t,linklist &l) if(t) if(t-lc
17、hild=null&t-rchild=null) insertlist(l,t-data); leaf(t-lchild,l); leaf(t-rchild,l); 单链表输出函数: void outlist(linklist l) /输出单链表 lnode *p; p=l-next; while(p) printf(%4d,p-data); p=p-next;创建树r函数: bstree copy(bstree t) /把树t复制到树r bstree r; if(t=null) return null; r=(bstree)malloc(sizeof(bstnode); r-data=t-d
18、ata; r-lchild=copy(t-lchild); r-rchild=copy(t-rchild); return r; 树r左右子树交换函数: void create1(bstree &r) bstree q; if(r) create1(r-lchild); create1(r-rchild); q=r-rchild; r-rchild=r-lchild; r-lchild=q; 计算只有一个孩子结点的函数: int jie(bstree r) int left,right,a; if(!r) return 0; if(r-lchild=null&r-rchild!=null) r
19、eturn 1; if(r-lchild!=null&r-rchild=null) return 1; left=jie(r-lchild); right=jie(r-rchild); a=left+right; return a; 祖先结点函数: void bstree(bstree r,int e) int vmax,i=0,j; bstree q=r; while(q) if(e=q-data) break; else if(edata) vi=q-data; q=q-rchild; else vi=q-data; q=q-lchild; +i; if(!q) return; for(j
20、=0;ji;j+) printf(%4d,vj); 主函数: int main() int e,k,a=0; char c; bstree t,r; linklist l; create(t); printf(1、该二叉排序树的中序遍历序列:n); outtree(t); r=copy(t); create1(r); printf(n2、输入你插入的数字:); scanf(%d,&e); insert(t,e); outtree(t); printf(n3、请输入你要删除的数字:); scanf(%d,&k); deletebst(t,k,e); outtree(t); printf(n4、请
21、输入你要删除的数字:); scanf(%d,&k); deletebst1(t,k,e); outtree(t); createlist(l); printf(n5、是否输出叶子结点构成的单链表 y or n: ); scanf(%s,&c); if(c=y) leaf(t,l); outlist(l); printf(n6、是否输出二叉排序树的左右子树进行交换后的二叉树 y or n: ); scanf(%s,&c); if(c=y) outtree(r); printf(n7、是否输出二叉排序树中只有一个孩子结点的结点个数 y or n: ); scanf(%s,&c); if(c=y)
22、printf(%4d,jie(r); printf(n8、请输入要求祖先结点的元素: ); scanf(%d,&e); bstree(r,e); system(pause); return 0; 1.4 程序运行说明与结果1、创建二叉排序树,并以中序遍历输出图(1):2、 向二叉排序树插入元素58:3、删除二叉排序树元素45(删除中序前驱):4、删除二叉排序树元素45(删除中序后继):由于在3中已删除45,故给出提示,输出原树。5、输出叶子结点:由于树t在2中输入58,故多了元素58。6、交换树t的左右子树,输出图(2):中序遍历输出的图(2)是图(1)的倒序。7、 输出只有一个子树的结点个数
23、:8、查找元素40的祖先结点,并输出:9、所有的运行结果视图:312. 最短路径问题2.1 问题描述假设网中的顶点用一个整数来表示,并从0开始编号,若网中有n个顶点,则这n个顶点为0,1,n-1。并假设网中不存在顶点到自身的弧。若网采用邻接矩阵存储结构,则直接用一个二维数组来表示。如下图所示的一个有向网:9 0124356136244457337211 图(1)(1)基于图的邻接表存储结构重新设计dijkstra算法及其输出算法,并以图(1)的有向网为测试实例编程实现。(2)dijkstra算法适合求解权值非负的单源最短路径问题,即求一个顶点到其余各个顶点的最短路径。现给定一个有向网g=(v,
24、e),各条边上的权值均非负,给定g中一个顶点t,要求求出其余各个顶点到顶点t的最短路径长度并构造最短路径,这个问题称为单目标最短路径问题。基于邻接矩阵存储结构设计算法并以图(1)的有向网为测试实例编程实现。 (3)假设dijkstra算法采用邻接矩阵存储结构,利用dijkstra算法求有向网中任意两个顶点间的最短路径长度并构造最短路径。以图(1)的有向网为测试实例编程实现。(4)假设dijkstra算法采用邻接矩阵存储结构,求有向网中顶点i到顶点j的最短路径长度并输出最短路径,只求顶点i到顶点j的最短路径,不能有冗余的循环,i和j从键盘输入,并作为函数参数。(5)dijkstra算法不仅可以求
25、解有向网中权值非负的单源最短路径问题,对于无向网中权值非负的单源最短路径问题,同样适用。设g=(v,e)是一个连通无向网,采用邻接矩阵存储结构,每条边上的权值均非负,从g中任取一个顶点i,考虑顶点i到各个顶点的最短路径长度:d(i,0),d(i,1),d(i,n-1)其中d(i,k)(0kn-1)表示顶点i到顶点k的最短路径长度,规定d(i,i)=0。这n个值中最大的那个称为顶点i的最大距离,记为l(i),在所有顶点中,使l(i)达到最小的顶点称为网g的中心。利用dijkstra算法编程求解给定无向网的中心。例如,下面这个无向网的中心为顶点521354632261.51.8031.52.5图(
26、2) (6)假设将5题中的网看成是一个矿区,它有7个矿,分别在顶点0,1,.,6处,这7个矿每天的矿产量分别是0:3000t,1:2000t,2:7000t,3:1000t,4:5000t,5:1000t,6:4000t,如下图所示。21354632261.51.8031.52.5(3000)(5000)(7000)(1000)(2000)(1000)(4000)图(3)现在要在顶点0,1,.,6中选一个来建选矿厂,如果选矿厂建在了顶点i,那么我们关心的是将各个矿生产的矿石都运到顶点i处的运输量是多少,然后再来确定在哪里建选矿厂最好。一般情况下,我们以运输的tkm数来度量运输量的大小,一吨货物
27、运输一公里就叫1tkm。例如,如果选矿厂建在顶点0处,则总的运输量表示为g(0),它等于g(0)=30000+20003+70005+10006.3+50009.3+10004.5+40006=122300(tkm) 如果选矿厂建在顶点1处,则总的运输量表示为g(1),它等于 g(1)=30003+20000+70002+10003.3+50006.3+10001.5+40003=68300(tkm) 显然,选矿厂建在顶点1要比建在顶点0处好,因为建在顶点1处时运输量较小。当然,顶点1是不是最好的还不能确定,应把g(0),g(1),g(6)都算出来再比较一下,才可以选出一个最好的建厂地点。 一
28、般情况下,给定无向网g=(v,e),采用邻接矩阵存储结构,每条边上的权值均非负,g的每个顶点i还有一个“产量”a(i),对于每个顶点i,令:g(i)=a(0)d(0,i)+ a(1)d(1,i)+a(n-1)d(n-1,i)其中d(k,i)(0kn-1)表示顶点k到顶点i的最短路径长度。g(i)代表了把各个点的物资运到顶点i处所花费的tkm,对于具有n个顶点的无向网g来说,使得g(i)达到最小的那个顶点i就称为该网的中央点,利用dijkstra算法编程求解给定无向网的中央点。 例如,上述图(3)的中央点为顶点2。2.2 设计方案与概要设计1. 最短路径问题应用的存储结构 typedef str
29、uct arcnode int weight; int adjvex; struct arcnode *nextarc; arcnode; typedef struct vnode vertextype data; arcnode *firstarc; vnode; typedef struct vnode verticesmax; int vexnum,arcnum; int kind; algraph;应用到很多的数组,其g100100用于邻接矩阵存储,d100用于存储路径长度,path100用于存储上一个邻接点,final100用于区分集合s和v,final=1时在集合s,final=0
30、时在集合v。2.方案设计通过邻接表寻找有向图中源点到各点的最短路径,要先创建邻接表。把dijkstra算法设计为利用邻接表查找最短路径的算法,在输入源点后调用方法并进行输出操作。至于单目标问题创建一个与原邻接表相反的逆邻接表,如果创建成功则与源点问题相同。任意两点间的最短路径是把个元素分别作为源点,依次调用方法并进行输出,得到任意两点间的最短路径。固定两点的最短路径是通过邻接矩阵实现,利用dijkstra算法得到所有的最短路径,在输出时只输出固定两点的最短路径。无向网的最短路径方法亦可用dijkstra算法实现,得到以所有元素为源点的最短路径,并获得每个元素的最大距离,然后比较每个元素的最大距
31、离得到最小距离即为网g的中心。在获得每个元素到个顶点距离时同时乘以每个元素的运输量,得到总运输量,进行在比较得到运输量最小的元素即为该网的中央点。3. 设计程序的整体功能结构(整体算法的描述)int locatevex(algraph &g, vertextype v):查找元素是否存在有向图中;void createdg(algraph &g,algraph &l):创建邻接表有向图g和其逆邻接表;void graphoutput(algraph &g):用邻接表输出有向图g;void dijkstra(int s,algraph &g) :邻接表型的dijkstra算法;void out(
32、int s,algraph &g):邻接表dijkstra算法的输出;void out1(int s,algraph &l):单目标的最短路径输出;void dijkstra(int n,int s,int v):两定点间的dijkstra算法;void out(int n,int s,int v):两定点间的路径输出;void dijkstra(int n, int s):dijkstra算法;void out(int n, int s):最短路径输出和获得最大距离;void out1(int n, int s):输出总运输量;int main():主函数; 2.3 详细设计题(1)、(2)
33、和(3)代码如下:#include #include #include #define max 20 typedef char vertextypemax; /顶点类型typedef struct arcnode /有向图,省略的第二个成员 int weight; int adjvex; struct arcnode *nextarc; arcnode; typedef struct vnode vertextype data; arcnode *firstarc; vnode; typedef struct vnode verticesmax; int vexnum,arcnum; int
34、kind; algraph;查找函数: int locatevex(algraph &g, vertextype v) int i; for (i=0;ig.vexnum;i+) if(strcmp(g.verticesi.data,v)=0) return i; return -1;创建有向图: void createdg(algraph &g,algraph &l) int i,k,j,a,x,y; vertextype v1,v2; arcnode *p,*s; g.kind=3; printf(请输入有向图的顶点数:n); scanf(%d,&(g.vexnum); printf(请输
35、入有向图的边数:n); scanf(%d,&(g.arcnum); l.vexnum=g.vexnum; l.arcnum=g.arcnum; for(k=0;kg.vexnum;k+) getchar(); printf(输入第%d个顶点: ,k+1); scanf(%s,g.verticesk.data); strcpy(l.verticesk.data,g.verticesk.data); g.verticesk.firstarc=null; l.verticesk.firstarc=null; for(k=0;kg.arcnum;k+) getchar(); printf(输入第%d边
36、 和 权值n,k+1); scanf(%s%s%d,v1,v2,&a); i= locatevex (g,v1); j= locatevex (g,v2); x= locatevex (l,v1); y= locatevex (l,v2); if(i0 |j0|x0|yadjvex=j; s-adjvex=x; p-weight=a; s-weight=a; p-nextarc=g.verticesi.firstarc; s-nextarc=l.verticesy.firstarc; g.verticesi.firstarc =p; l.verticesy.firstarc =s; 输出邻接表
37、函数: void graphoutput(algraph &g) /邻接表的输出 int i; arcnode *s; for(i=0;i%4d 权值%d,s-adjvex,s-weight); s=s-nextarc; printf(n); 邻接表dijkstra算法函数:int final100,d100,path100;void dijkstra(int s,algraph &g) int i,j,k,min,b; arcnode *p; p=g.verticess.firstarc; finals=1; for(i=0;iadjvex=p-weight; pathp-adjvex=s;
38、 p=p-nextarc; for(j=1;jg.vexnum;j+) min=999; for(i=0;ig.vexnum;i+) if(!finali&diadjvex; if(!finalb&p-weight+dkweight+dk; pathp-adjvex=k; p=p-nextarc; 邻接表dijkstra算法输出函数:void out(int s,algraph &g) int b100; int i,j,p,m; dijkstra(s, g); for(i=0;i=0;j-) printf(%4d,bj); printf(n); 单目标输出函数:void out1(int s,algraph &l) int b100; int i,j,p,m; dijkstra(s, l); for(i=0;il.ve
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《皮肤性病学湿疹》课件
- 行政后勤财务报销审核
- 母亲节 营销新视角
- 体育行业话务员工作总结
- 餐饮行业服务员的服务宗旨
- 体育场馆的卫生清洁
- 2023-2024年企业主要负责人安全培训考试题考题
- 2023-2024安全培训考试题及答案(新)
- 函授专科毕业自我鉴定15篇
- 课题研究报告
- 养老服务中心装饰装修工程施工方案
- 落地式脚手架监理实施细则
- 上海市金山区2022-2023学年中考一模英语试题含答案
- 节水灌溉供水工程初步设计报告
- 【期末试题】河西区2018-2019学年度第一学期六年级数学期末试题
- 2022年总经理年会发言稿致辞二
- 警综平台运行管理制度
- 立法学完整版教学课件全套ppt教程
- 简约中国风水墨山水工作总结通用PPT模板
- 矿山测量课程设计
- 药厂生产车间现场管理-PPT课件
评论
0/150
提交评论