版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、算法与数据结构课程设计报告系 (院): 计算机科学学院 专业班级: 教育技术学1001班 姓 名: 宋佳 学 号: 201003901 指导教师: 詹泽梅 设计时间: 2012.6.16 - 2012.6.24 设计地点: 4号楼2号机房 算法与数据结构课程设计任务书班级:教育技术11001课程设计题目:图的基本操作及应用数据结构课程设计是在学完数据结构课程之后的实践教学环节。本实践教学是培养学生数据抽象能力,进行复杂程序设计的训练过程。要求学生能对所涉及问题选择合适的数据结构、存储结构及算法,并编写出结构清楚且正确易读的程序,提高程序设计基本技能和技巧。一设计目的1提高数据抽象能力。根据实际
2、问题,能利用数据结构理论课中所学到的知识选择合适的逻辑结构以及存储结构,并设计出有效解决问题的算法。2提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。3初步了解开发过程中问题分析、整体设计、程序编码、测试等基本方法和技能。二设计任务设计一个基于dos菜单的应用程序。要利用多级菜单实现各种功能。内容如下:1 无向图的基本操作及应用 创建无向图的邻接矩阵 创建无向图的邻接表 无向图的深度优先遍历 无向图的广度优先遍历2 有向图的基本操作及应用 创建有向图的邻接矩阵 创建有向图的邻接表 拓扑排序3 无向网的基本操作及应
3、用 创建无向网的邻接矩阵 创建无向网的邻接表 求最小生成树 4 有向网的基本操作及应用 创建有向网的邻接矩阵 创建有向网的邻接表 关键路径 单源最短路径 三设计指导第一步:根据设计任务,设计dos菜单。第二步:设计菜单(c语言)#includevoid showmainmenu()printf(n);printf(*图的基本操作及应用*n);printf(* 1 无向图的基本操作及应用 *n);printf(* 2 有向图的基本操作及应用 *n);printf(* 3 无向网的基本操作及应用 *n);printf(* 4 有向网的基本操作及应用 *n);printf(* 5 退出n);prin
4、tf(*n);void udg()int n;doprintf(n);printf(*无向图的基本操作及应用*n);printf(* 1 创建无向图的邻接矩阵 *n);printf(* 2 创建无向图的邻接表 *n);printf(* 3 无向图的深度优先遍历 *n);printf(* 4 无向图的广度优先遍历 *n);printf(* 5 退出n);printf(*n);printf(请选择:);scanf(%d,&n);switch(n)case 1:printf(-wait-);break;case 2:printf(-wait-);break;case 3:printf(-wait-)
5、;break;case 4:printf(-wait-);break;case 5:break;default:printf(error!);while(n!=5);void dg() int n;doprintf(n);printf(*有向图的基本操作及应用*n);printf(* 1 创建有向图的邻接矩阵 *n);printf(* 2 创建有向图的邻接表 *n);printf(* 3 拓扑排序 *n);printf(* 4 退出 *n);printf(*n);printf(请选择:);scanf(%d,&n);switch(n)case 1:printf(-wait-);break;cas
6、e 2:printf(-wait-);break;case 3:printf(-wait-);break;case 4:break;default:printf(error!);while(n!=4);void udn() int n;doprintf(n);printf(*无向网的基本操作及 *n);printf(* 1 创建无向网的邻接矩阵 *n);printf(* 2 创建无向网的邻接表 *n);printf(* 3 prim算法求最小生成树 *n);printf(* 4 kraskal算法求最小生成树 *n);printf(* 5 退出n);printf(*n);printf(请选择:
7、);scanf(%d,&n);switch(n)case 1:printf(-wait-);break;case 2:printf(- -wait-);break;case 3:printf(-wait-);break;case 4:printf(-wait-);break;case 5:break;default:printf(error!);while(n!=5);void dn() int n;doprintf(n);printf(*有向网的基本操作*n);printf(* 1 创建有向网的邻接矩阵 *n);printf(* 2 创建有向网的邻接表 *n);printf(* 3 关键路径
8、 *n);printf(* 4 单源顶点最短路径问题 *n);printf(* 5 退出n);printf(*n);printf(请选择:);scanf(%d,&n);switch(n)case 1:printf(-wait-);break;case 2:printf(-wait-);break;case 3:printf(-wait-);break;case 4:printf(-wait-);break;case 5:break;default:printf(error!);while(n!=5);void main()int n;doshowmainmenu();printf(请选择:);
9、scanf(%d,&n);switch(n)case 1:udg();break;case 2:dg();break;case 3:udn();break;case 4:dn();break;case 5:break;default:printf(error!);break;while(n!=5);第三步:添加功能函数。在主程序的合适位置添加相应的函数实现各功能(提示:语句printf(“-wait-”)所在位置)。四成绩评定l 实习报告(文字不得少于4000字)一、 设计方案;二、 实现过程;三、 实现代码;四、 测试;五、 结论;六、 难点与收获。l 程序实现1. 程序运行正确,无编译错误
10、,无逻辑错误;2. 在第一条的基础上,任务完成的越多,成绩等级越高。l 成绩由三部分组成:平时考核(20%)、程序实现(50%)、实习报告(30%)一、 设计方案由课程设计任务书,按照要求,需要设计有向图3、有向网、无向图 、无向网四种图,邻接矩阵、邻接表两种数据存储结构,共十六种基本操作及应用,三层以上的显示菜单。图的操作中又包含有有关线性表、栈和队列的基本操作。由于显示菜单已给出,剩下的只是把函数写入其中,而线性表、栈和队列的基本操作并不复杂,很容易实现,我们只有完成图的相关操作即可。图的操作都是以两种存储结构为基础的,邻接矩阵存储结构和邻接表存储结构,如四种图(有向图,有向网,无向图,无
11、向网)的创建,其他的操作都是在四种图创建后才开始进行的。所以,首先必须理解两种存储结构的定义。图的邻接矩阵存储结构即图的数组表示法。用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。用邻接矩阵存储结构的图具有以下几点特征:(一):顶点数:vexnum,边(弧)数:arcnum,图的种类:kind;(二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info);(三):顶点向量(顶点名):vexs;其优点是以二维数组表示有n个顶点的图时,需存放n顶点的信息和n*n个弧的信息存储量。借助于邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求各个顶点的
12、度。缺点其时间复杂度是o(n*n),例如,构造一个具有n个顶点和e条边的无向网的时间复杂度为o(n*n+e*n)。图的邻接表存储结构是图的一种链式存储结构。对图中的每个顶点建立一个单链表,每个结点有三个域组成,邻接点域adjvex(弧尾在邻接表链表中的位序),链域nextarc(下一条弧),数据域info(权值)。还要建立一个邻接表链表,用以存放顶点名data和后继指针firstarc,表头结点以顺序结构的形式存储,便于随机访问任一顶点的单链表。邻接表存储结构的优点在于其时间复杂度小。除此之外,还有十字链表存储结构和多重链表存储结构。由于,没有用到他们,故不再详细描述。树的深度优先搜索遍历类似
13、于树的先根遍历,是树的先根遍历的推广。从图中的某个顶点出发,访问此顶点,然后依次从该顶点出发深度优先搜索遍历图,直至图中所有与该顶点有关的路径都被访问到;此时图中若还有顶点未被访问到,则另选图中的一个未被访问的顶点作为起始点,重述上述过程,直至所有顶点都被访问到。广度优先搜索遍历类似于树的按层次遍历的过程。以某个顶点为起始顶点,由近至远,依次访问和该顶点有路径相通的且路径长度为1, 2, 3,的顶点。当图中所有顶点都被访问到后,就完成了图的广度优先搜索遍历。求无向网的最小生成树问题有两种算法:prima算法和kruskal算法。prima算法是从网中的某个顶点出发,选择与该顶点有路径的所有顶点
14、中路径最小的一条路径,从该最小路径的另一顶点出发,重复上述过程,直至图中所有顶点都被访问完成。kruskal算法是从网中找出所有路径最小的一条路径,记下已访问该路径的两个顶点,再次从图中找出剩下路径中的最小路径,重复上述过程,直至所有顶点都被访问完成,按访问的顺序依次输出各顶点,即构造了一棵最小生成树。由某个集合上的一个偏序得到该集合的一个全序的操作就叫做拓扑排序。拓扑排序主要有两个方面的操作:(1)在有向图中选择一个没有前驱的顶点并输出;(2)在图中删除该顶点和所有以它为尾的弧。重复上述两步,直至全部顶点均已输出,就得到了一个拓扑有序序列。求关键路径的算法如下:输入e条弧,建立aoe网的存储
15、结构;从源点v0出发,令ve0=0,按拓扑有序求其余各顶点的最早发生时间。如果得到的拓扑有序序列中的顶点个数小于网中的顶点数,则说明网中存在环,不能求关键路径,算法终止;否则执行第三步。从汇点vn出发,令vln-1=ven-1,按逆拓扑有序求其余各顶点的最迟发生时间vli;根据各顶点的和值,求每条弧的最早开始时间e(s)和最迟开始时间e(s),若某条弧满足条件e(s)=l(s),则为关键活动。从某个源点到其余各顶点的最短路径问题:若从v到vi有弧,则di为弧上的权值,否则di为无穷大。显然,长度为dj=mindi|vi属于v的路径就是从v出发的长度最短的一条路径。二、 实现及测试过程按照设计任
16、务的要求,我先完成了存储结点、边、邻接矩阵、邻接表、队列、栈等储存结构体的设计。其次是栈和队列的基本操作和实现,四种图的创建和显示,然后是基于两种存储结构的各种算法的现,最后是三层显示输出菜单。测试样图:三、实现代码#include #include#include #define error 0#define ok 1#define infinity int_max#define max_vertex_num 21#define stack_init_size 100#define stackincreament 10typedef enumdg,dn,udg,udngraphkind;ty
17、pedef struct arccell int adj; /infotype *info;arccell, adjmatrixmax_vertex_nummax_vertex_num;typedef struct char vexsmax_vertex_num; adjmatrix arcs; int vexnum,arcnum; graphkind kind;mgraph; /邻接矩阵typedef struct arcnode int adjvex; int quan; struct arcnode *nextarc; arcnode,*alist;typedef struct vnod
18、e char data; alist firstarc;vnode,adjlistmax_vertex_num;typedef struct adjlist vertices; int vexnum,arcnum; graphkind kind;algraph; /邻接表typedef struct qnodechar data;struct qnode *next;qnode,*queuepre;typedef structqueuepre front;queuepre rear;linkqueue; /队列typedef struct int *base;int *top;int stac
19、ksize;sqstack; /栈typedef struct char adjvex;int lowcost;closedgesmax_vertex_num; /求最小生成树中的辅助数组int option; int visitedmax_vertex_num; /顶点访问标记数组int indegreemax_vertex_num; /顶点入度记录数组int vemax_vertex_num; /顶点权值记录数组int setgraphkind(mgraph &g,int option) switch(option) case 1: g.kind=dg;break; case 2: g.k
20、ind=dn;break; case 3: g.kind=udg;break; case 4: g.kind=udn;break; default: return error; return ok; /邻接矩阵类型设置int setgraphkind(algraph &g,int option) switch(option) case 1: g.kind=dg;break; case 2: g.kind=dn;break; case 3: g.kind=udg;break; case 4: g.kind=udn;break; default: return error; return ok;
21、/邻接表类型设置int locatevex(mgraph g,char v) int m; for(m=1;m=g.vexnum;m+) if(g.vexsm=v) return m; return error; /邻接矩阵顶点定位int locatevex(algraph g,char v) int m; for(m=1;mnext=null;return ok; /队列创建int enqueue(linkqueue &q,int e)queuepre p;p=(queuepre)malloc(sizeof(qnode);if(!p) return ok;p-data=e;p-next=nu
22、ll;q.rear-next=p;q.rear=p;return ok; /元素入队列int dequeue(linkqueue &q,int &e)queuepre p;if(q.front=q.rear) return error;p=q.front-next;e=p-data;q.front-next=p-next;if(q.rear=p) q.rear=q.front;free(p);return ok; /元素出队列int queueempty(linkqueue q)if(q.front=q.rear)return ok;return error; /判断队列是否为空int ini
23、tstack(sqstack &s)s.base=(int*)malloc(stack_init_size*sizeof(int);if(!s.base) return error;s.top=s.base;s.stacksize=stack_init_size;return ok; /栈创建int push(sqstack &s,int e)if(s.top-s.base=s.stacksize)s.base=(int*)realloc(s.base,(s.stacksize+stackincreament)*sizeof(int);if(!s.base) return error;s.to
24、p=s.base+s.stacksize;s.stacksize+=stackincreament;*s.top+=e;return ok; /元素入栈int pop(sqstack &s,int &e)if(s.top=s.base) return error;e=*-s.top;return ok; /元素出栈int stackempty(sqstack s)if(s.top=s.base) return ok;return error; /判断栈是否为空int creatgraph(mgraph &g) int i,j,k,w;char x,y; if(!setgraphkind(g,o
25、ption) printf(对图类型的设置失败);return error; printf(邻接矩阵:请输入定点的个数、弧的个数:); scanf(%d %d,&g.vexnum,&g.arcnum); if(g.vexnum20) printf(您输入的顶点个数超过最大值); return error; printf(请输入%d个顶点n,g.vexnum); for(i=1;i=g.vexnum;+i) fflush(stdin); scanf(%c,&g.vexsi); if(g.kind=dg|g.kind=udg) for(i=1;i=g.vexnum;i+) for(j=1;j=g.
26、vexnum;j+) g.arcsij.adj=0; if(g.kind=dg) printf(请输入有向图的两个相邻的顶点(如果互相邻接则也要输入):n); for(k=1;k=g.arcnum;k+)fflush(stdin); scanf(%c%c,&x,&y); i=locatevex(g,x);j=locatevex(g,y); g.arcsij.adj=1; else printf(请输入无向图的两个相邻的顶点(x,y):n); for(k=1;k=g.arcnum;k+)fflush(stdin); scanf(%c%c,&x,&y); i=locatevex(g,x); j=l
27、ocatevex(g,y); g.arcsij.adj=1; g.arcsji.adj=g.arcsij.adj; else for(i=1;i=g.vexnum;i+) for(j=1;j=g.vexnum;j+) g.arcsij.adj=int_max; if(g.kind=dn) printf(请输入有向网的两个相邻的顶点以及相应的权值w(如果互相邻接则也要输入):n); for(k=1;k=g.arcnum;k+)fflush(stdin); scanf(%c%c %d,&x,&y,&w); i=locatevex(g,x); j=locatevex(g,y); g.arcsij.a
28、dj=w; else printf(请输入无向网的两个相邻的顶点(x,y)以及相应的权值w:n); for(k=1;k20) printf(您输入的顶点个数超过最大值); return error; printf(请输入个顶点:n);for(i=1;i=g.vexnum;i+)fflush(stdin);scanf(%c,&g.verticesi.data);g.verticesi.firstarc=null;keyi=0;if(g.kind=dg)printf(请输入弧(如ab,其中ab与ba是不同的弧):n);for(j=1;jnextarc=null;q-adjvex=n;while(k
29、eym&p-nextarc)p=p-nextarc;keym+;if(!keym)g.verticesm.firstarc=q;keym+;else p-nextarc=q; if(g.kind=udg)printf(请输入弧(如ab,其中ab与ba是不同的弧):n);for(j=1;jnextarc=null;q-adjvex=n;while(keym&p-nextarc)p=p-nextarc;keym+;if(!keym)g.verticesm.firstarc=q;keym+;else p-nextarc=q; if(g.kind=dn)printf(请输入依次输入弧以及这条弧的权值(
30、如ab 8,其中ab与ba是不同的弧):n); for(j=1;jnextarc=null;q-quan=w;q-adjvex=n;while(keym&p-nextarc)p=p-nextarc;keym+;if(!keym)g.verticesm.firstarc=q;keym+;else p-nextarc=q ; if(g.kind=udn)printf(请输入依次输入弧以及这条弧的权值(如ab 8,其中ab与ba是不同的弧):n); for(j=1;jnextarc=null;q-quan=w;q-adjvex=n;while(keym&p-nextarc)p=p-nextarc;k
31、eym+;if(!keym)g.verticesm.firstarc=q;keym+;else p-nextarc=q ; return ok; /创建邻接表int firstadjvex(algraph g,int v)if(g.verticesv.firstarc)return g.verticesv.firstarc-adjvex;return 0;int nextadjvex(algraph g,int v,int w)alist s;s=g.verticesv.firstarc;while(s-adjvex!=w)s=s-nextarc;if(s-nextarc)return s-n
32、extarc-adjvex;return 0;void dfs(algraph g,int v)int w;visitedv=1; printf(%c ,g.verticesv);for(w=firstadjvex(g,v);w=1;w=nextadjvex(g,v,w)if(!visitedw) dfs(g,w); void dfstraverse(algraph g)int v;visited0=1;for(v=1;v=g.vexnum;v+) visitedv=0;for(v=1;v=g.vexnum;v+)if(!visitedv) dfs(g,v); /图的深度遍历void bfst
33、raverse(algraph g)int v,w,u;linkqueue q;for(v=1;v=g.vexnum;v+) visitedv=0;visited0=1;initqueue(q);for(v=1;v=1;w=nextadjvex(g,u,w) if(!visitedw)visitedw=1; printf(%c ,g.verticesw);enqueue(q,w); else break; /图的广度遍历void findindegree(algraph g,int in)int i,j,k;alist p;for(k=1;k=g.vexnum;k+) ink=0;for(i=
34、1;iadjvex;inj+;p=p-nextarc; /计算各顶点入度 int topologicalsort(algraph g)int i,k,count;alist p;sqstack s;findindegree(g,indegree);initstack(s);for(i=1;inextarc)k=p-adjvex;if(!(-indegreek) push(s,k);if(count=g.vexnum) return error;else return ok; /拓扑排序int minimum(mgraph g,closedges m)int i,j,min=infinity;f
35、or(i=1;i=g.vexnum;i+)if(mi.lowcost)if(mi.lowcostmin)min=mi.lowcost;j=i; return j;void minspantree_prim(mgraph g,char u)int i,j,k;closedges closedge;k=locatevex(g,u);for(j=1;j=g.vexnum;j+)if(j!=k) closedgej.adjvex=u;closedgej.lowcost=g.arcskj.adj;closedgek.lowcost=0;for(i=2;i=g.vexnum;i+)k=minimum(g,closedge);printf(%c%c ,closedgek.adjvex,g.vexsk);closedgek.lowcost=0;for(j=1;j=g.vexnum;j+)if(g.arcsk
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【文档】应急管理部18号令《安全生产违法行为行政处罚办法》重点解读
- 2024-2025学年反射疗法师3级经典例题重点附答案详解
- 证据支持下的护理实践
- 紧急项目进度通报回复函7篇范本
- 2024-2025学年公务员(省考)考前冲刺试卷(考点梳理)附答案详解
- 2024-2025学年云南交通职业技术学院电视播音主持期末考试考前冲刺试卷及参考答案详解(达标题)
- 2024-2025学年度执业兽医试题(夺分金卷)附答案详解
- 2024-2025学年度专升本试卷带答案详解(达标题)
- 2024-2025学年度收银审核员模拟试题【有一套】附答案详解
- 2024-2025学年度烟台汽车工程职业学院单招数学题库试题附参考答案详解【巩固】
- 2026年宁夏葡萄酒与防沙治沙职业技术学院自主公开招聘工作人员考试参考试题及答案解析
- 推动职业教育国际化-交流协会的探索与实践
- 2026中央台办所属事业单位招聘10人笔试备考试题及答案解析
- 2025年“安全生产月”《安全知识》培训考试题库及答案
- 2026浙江台州市港航事业发展中心招聘2人考试备考试题及答案解析
- 腹膜透析护理实践指南(2025年版)
- GB/T 1535-2026大豆油
- 2026年临汾职业技术学院单招职业倾向性考试题库含答案详解(完整版)
- 2026校招:远大物产集团试题及答案
- 康复中心考核制度
- 点金手丰年课件在线看
评论
0/150
提交评论