版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、算法与数据结构课程设计 班 级: 姓 名:指导老师:2015年6月222015年7月3日 目录1设计方案.32实现过程33测试34使用说明.135难点与收获.136实现代码.137可改进的地方.25一 设计方案能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,选择相应的存储结构,设计出解决问题的有效算法,实现图的一些基本操作,此次设计主要需要解决对无向图,无向网,有向图,有向网的一些基本操作和应用,因此可以设计一个基于VC或VS的应用程序,数据可以从键盘输入,然后设计程序利用多级菜单实现各种功能。二 实现过程实现过程的主函数为:void main( )1 对无向图的基本操作及应
2、用的实现 创建无向图的邻接矩阵(void creat_mg(Mgraph G)) 创建无向图的邻接表 (void CreatAdjList(Graph* G)) 无向图的深度优先遍历 (void DFS(Graph *G, int i, int visited)) 无向图的广度优先遍历 (void BFS(Graph* G,int v,int visited))2 对无向网的基本操作及应用的实现 创建无向网的邻接矩阵 (CreateNDNGraphics(Graphics &G)) 创建无向网的邻接表(CreateUDN(ALGraph &G)) 求最小生成树(Prim(int
3、 graphMAX, int n))3 对有向图的基本操作及应用的实现 创建有向图的邻接矩阵(CreateDGraphics(Graphics &G)) 创建有向图的邻接表(CreateDG(ALGraph &G)) 拓扑排序(TopSort(Graphaa& g))4 对有向网的基本操作及应用的实现 创建有向网的邻接矩阵(CreateDNGraphics(Graphics &G)) 创建有向网的邻接表(CreateUDN(ALGraphh &G, indegree indegree)) 关键路径 (CriticalPath(ALGraphh &
4、g, indegree indegree)) 单源最短路径(myDijstra(n,1))三 测试 数据输入:从键盘输入操作对应的序号1. 最初入口界面2. 无向图:无向图的邻接矩阵:无向图的邻接表:无向图的深度优先遍历:无向图的广度优先遍历:3. 无向网的基本操作及应用无向网的邻接矩阵:无向网的邻接表:最小生成树:4. 有向图的基本操作及应用创建有向图的邻接矩阵:创建有向图的连接表有向图的拓扑排序;5. 有向网的基本操作及应用有向网的邻接矩阵:创建有向网的邻接表;有向网的关键路径:4.单源顶点路径最短问题:四 使用说明 总共有三级选择菜单,根据需要从键盘输入对应菜单序号,进入相应输入界面,输
5、入待测数据,对图或网进行相应的操作五 难点与收获用代码实现各种操作时,代码容易出现逻辑上的错,个人觉得这种错误易发现但比较难修改,比如,在实现图的深度优先遍历时,利用了递归函数(DFS(G,i,visited)),通过查找资料和看书,多次调试,在程序中实现调用,实现了对图的深度优先遍历。这次通过上机实习,我更加深入的学习了图和网的相关内容和掌握了图和网的一些基本操作,也学会有效利用基本调试方法,会找出程序代码中的错误并且修改,提高了自己发现问题和解决问题的能力,受益匪浅。六实现代码无向图:/=创建无向图(邻接表)=/void CreatAdjList(Graph* G) int i,j,k;e
6、dgenode * p1;edgenode * p2;cout<<"请输入无向图的顶点数和边数(如:2 1):"<<endl;cin>>G->vexnum>>G->arcnum;cout<<endl;cout<<"开始输入顶点表(如:1 2)"<<endl;for (i=1;i<=G->vexnum;i+)cin>>G->adjlistsi.vertex;G->adjlistsi.edgelink=NULL;cout<
7、<endl;cout<<"开始输入边表信息:"<<endl; cout<<endl;for (k=1;k<=G->arcnum;k+)cout<<"请输入边<Vi,Vj>对应的顶点序号(如:2 3):"cin>>i>>j; cout<<endl;p1=new edgenode;p1->endver=j;p1->edgenext=G->adjlistsi.edgelink;G->adjlistsi.edgelink=p1
8、;p2=new edgenode;p2->endver=i;p2->edgenext=G->adjlistsj.edgelink;G->adjlistsj.edgelink=p2;/因为是无向图,所以有两次建立边表的过程void creat_mg(Mgraph G) int i,j,k; printf ("n请输入无向图的顶点数和边数,如(6,5)每次回车键输入:"); scanf ("%d,%d",&n,&e); for (i=1;i<=n;i+) for (j=1;j<=n;j+)Gij=0; /将
9、邻接矩阵初始化 for (k=1;k<=e;k+) printf ("n请输入每条边的两个顶点编号,如(2,5)每次回车键输入:"); scanf ("%d,%d",&i,&j); Gij=1; Gji=1; int a,b; for (a=1;a<=n;a+) printf ("n"); for (b=1;b<=n;b+) printf ("%5d",Gab); printf ("n"); /-广度优先遍历-/void BFS(Graph* G,int v,i
10、nt visited)/从第v个顶点出发非递归地广度优先搜索遍历无向图G。QueueList *Q=new QueueList;Q->front=Q->rear=NULL; /初始化队列QEnQueue(Q,v); /V入队列while(Q->rear!=NULL)int e;DeQueue(Q, &e); /队头(指定的)元素出队并置值为ecout<<G->adjlistse.vertex<<" " /输出顶点信息visitede=1; edgenode* p=new edgenode;p=G->adjlist
11、se.edgelink; /指向第一条依附于该顶点的边的指针if(p)int m=p->endver; /该边所指向的顶点的位置if(m=0)EnQueue(Q,m); while(visitedm=0) p=p->edgenext; if(p=NULL)break;m=p->endver;EnQueue(Q,m);有向网,无向网,无向图的邻接矩阵构造;int CreateDGraphics(Graphics &G) / 构造一个有向图 printf("分别输入弧数、顶点数(用空格):"); Info info = NULL; / 这里忽略info
12、信息 scanf("%d%d", &G.arcnum, &G.vexnum); / 先把邻接矩阵中的adj设置为0 for(int i = 0; i < G.vexnum; +i) for(int j = 0; j < G.vexnum; +j) G.arcij.adj = 0; / 扫描进入顶点元素 for(i = 0; i < G.vexnum; +i) printf("请依次输入顶点元素值:n"); scanf("%d", &G.vexsi); printf("输入完毕!n&q
13、uot;); / 输入弧信息 for(i = 0; i < G.arcnum; +i) printf("请输入具有邻接关系的顶点:n"); DataType d1, d2; scanf("%d%d", &d1, &d2); int p1 = LocateVex(G, d1); int p2 = LocateVex(G, d2); G.arcp1p2.adj = 1; printf("该有向图的邻接矩阵构造完毕"); return 1; / CreateDGraphics int CreateNDNGraphics
14、(Graphics &G) / 构造一个无向网 printf("分别输入弧数、顶点数(用空格):n"); Info info = NULL; / 这里忽略info信息 scanf("%d%d", &G.arcnum, &G.vexnum); / 先把邻接矩阵中的adj设置为0 for(int i = 0; i < G.vexnum; +i) for(int j = 0; j < G.vexnum; +j) G.arcij.adj = 0; / 借用改值为最大值 / 扫描进入顶点元素 for(i = 0; i <
15、G.vexnum; +i) printf("请依次输入顶点元素值:n"); scanf("%d", &G.vexsi); printf("输入完毕!n"); / 输入弧信息 for(i = 0; i < G.arcnum; +i) printf("请输入具有邻接关系的顶点,以及他们的权重(如2 1 3):n"); DataType d1, d2, d3; scanf("%d%d%d", &d1, &d2, &d3); int p1 = LocateVex(G
16、, d1); int p2 = LocateVex(G, d2); G.arcp1p2.adj = d3; / 因为是无向,所以对称设置 G.arcp2p1.adj = d3; printf("该无向网的邻接矩阵构造完毕"); return 1; / CreateNDNGraphics int CreateDNGraphics(Graphics &G) / 构造一个有向网 printf("分别输入弧数、顶点数(用空格):n"); Info info = NULL; / 这里忽略info信息 scanf("%d%d", &
17、;G.arcnum, &G.vexnum); / 先把邻接矩阵中的adj设置为0 for(int i = 0; i < G.vexnum; +i) for(int j = 0; j < G.vexnum; +j) G.arcij.adj = 0; / 借用改值为最大值 / 扫描进入顶点元素 for(i = 0; i < G.vexnum; +i) printf("请依次输入顶点元素值:n"); scanf("%d", &G.vexsi); printf("输入完毕"); / 输入弧信息 for(i =
18、 0; i < G.arcnum; +i) printf("请输入具有邻接关系的顶点,以及他们的权重:n"); DataType d1, d2, d3; scanf("%d%d%d", &d1, &d2, &d3); int p1 = LocateVex(G, d1); int p2 = LocateVex(G, d2); G.arcp1p2.adj = d3; printf("该有向网的邻接矩阵构造完毕"); return 1; / CreateDNGraphics /邻接表建立无向网int Creat
19、eUDN(ALGraph &G) /* 邻接表建立无向网 */ int i,s,d,w; ArcNode *p, *q; printf("输入结点数目和边数(用空格):"); scanf("%d%d",&G.vexnum,&G.arcnum); /* 输入结点数目和边数 */ getchar(); for(i=1; i<=G.vexnum; i+) /* 输入顶点 */ printf("输入顶点(每一个按回车键):"); scanf("%c",&G.verticesi.data
20、); /* 输入顶点 */ getchar(); G.verticesi.firstarc = NULL; /* 首先初始化为NULL */ for(i=1; i<=G.arcnum; i+) printf("依次输入每条边依附的顶点序号,权值(空格/每一个按回车键):"); scanf("%d%d%d",&s,&d,&w); /* 输入一条边依附的起点序号和终点序号 */ getchar(); p = (struct ArcNode *)malloc(sizeof(struct ArcNode); q = (struct
21、ArcNode *)malloc(sizeof(struct ArcNode); p->info = (InfoType *)malloc(sizeof(InfoType); q->info = (InfoType *)malloc(sizeof(InfoType); p->adjvex = d; /* 保存该弧所指向的顶点位置 */ q->adjvex = s; /* 保存该弧所指向的顶点位置 */ *(p->info) = w; /* 保存权值到一个结点里 */ *(q->info) = w; /* 保存权值到一个结点里 */ p->nextarc
22、 = G.verticess.firstarc; G.verticess.firstarc = p; q->nextarc = G.verticesd.firstarc; G.verticesd.firstarc = q; return OK; /prime算法最小生成树int graphMAXMAX; int Prim(int graphMAX, int n)/* lowcosti记录以i为终点的边的最小权值,当lowcosti=0时表示终点i加入生成树 */int lowcostMAX; /* msti记录对应lowcosti的起点,当msti=0时表示起点i加入生成树 */int
23、mstMAX; int i, j, min, minid, sum = 0; /* 默认选择1号节点加入生成树,从2号节点开始初始化 */for (i = 2; i <= n; i+)/* 最短距离初始化为其他节点到1号节点的距离 */lowcosti = graph1i; /* 标记所有节点的起点皆为默认的1号节点 */msti = 1; /* 标记1号节点加入生成树 */mst1 = 0; /* n个节点至少需要n-1条边构成最小生成树 */for (i = 2; i <= n; i+)min = MAXCOST;minid = 0; /* 找满足条件的最小权值边的节点mini
24、d */for (j = 2; j <= n; j+)/* 边权值较小且不在生成树中 */if (lowcostj < min && lowcostj != 0)min = lowcostj;minid = j;/* 输出生成树边的信息:起点,终点,权值 */printf("%c - %c : %dn", mstminid + 'A' - 1, minid + 'A' - 1, min); /* 累加权值 */sum += min; /* 标记节点minid加入生成树 */lowcostminid = 0; /*
25、更新当前节点minid到其他节点的权值 */for (j = 2; j <= n; j+)/* 发现更小的权值 */if (graphminidj < lowcostj)/* 更新权值信息 */lowcostj = graphminidj; /* 更新最小权值边的起点 */mstj = minid;/* 返回最小权值和 */return sum;/kraskal算法求最小生成树关键代码:for(i=0;i<t;i+) scanf("%d %d %d",&ai.m,&ai.n,&ai.d); /输入每条边的权值 qsort(a,t,s
26、izeof(a0),cmp); min=num=0; for(i=0;i<t && num<n-1;i+) for(k=ai.m;xk!=k;k=xk) /判断线段的起始点所在的集合 xk=xxk; for(g=ai.n;xg!=g;g=xg) /判断线段的终点所在的集合 xg=xxg; if(k!=g) /如果线段的两个端点所在的集合不一样 xg=k; min+=ai.d; num+; printf("最小生成树中加入边:%d %dn",ai.m,ai.n); printf("最小生成树的权值为:%dn",min); sys
27、tem("pause"); 有向图的拓扑排序:void TopSort(Graphaa& g) cout << "The topsort is:" <<endl; for (int i=0; i<g.vertexNum; i+) VertexNode& v = FindZeroIndegree(g); if (v.indegree!=NULL) cout << "The graph has cycle, can not do topsort"<<endl; / pr
28、int graph as topsort. cout<< v.data << " " / for each vertex w adjacent to v, -indegree adjVertexNode* padjv = v.list; while (padjv!=NULL) /!这个算法这里破坏了原图中的入度信息。最后入度均为1 g.VertexNodepadjv->adjVertexPosition.indegree-; padjv = padjv->next; /避免入度信息均为零FindZeroIndegree找到删除的顶点,将删
29、除的顶点入度置为1 v.indegree+; cout << endl;有向网关键路径:/求关键路径void CriticalPath(ALGraphh &g, indegree indegree) /G为有向网,输出G的各项关键活动 ArcNode *q; int gettop,k,j; int ee,el; /活动最早发生时间和最迟发生时间 TopologicalSort(g, indegree); vl=(int *)malloc( g.vexnum*sizeof(int) ); /事件最早发生时间数组 for(int i=0; i<g.vexnum; i+)
30、vli=veg.vexnum-1; /初始化 cout<<"ve:"<<endl; /输出ve for(i=0; i<g.vexnum; i+) cout<<vei<<" " cout<<endl; while(top2!=0) /出栈是求vl gettop=stack2top2-; for(q = g.verticesgettop.firstarc; q; q = q->nextarc) /求各顶点事件的最迟发生时间vl值 k=q->adjvex; if(vlk - q->info1 < vlgettop) vlgettop = vlk - q->info1; /for cout<<"vl:"<<endl; /输出vl for(i=0; i<g.vexnum; i+) cout<<vli<<" " cout<<endl; for(j=0; j<g.vexnum; j+) /求ee,el和关键活动 for(q = g.verticesj.firstarc; q; q = q->nextarc) k=q->adj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文明传播责任状
- 国防生教育培养协议模板
- 工程审计分包合同版
- 水泥砖供应合同格式
- 婚礼摄影摄像服务合同
- 家电零售分销合同
- 专业家政服务小时工合同
- 农村养鸡设备采购合同
- 软件合作开发合同
- 混凝土构件订购合同
- 北师版七年级数学上册期末复习考点 清单04 基本平面图形(12个考点梳理+题型解读+提升训练)
- Pep小学英语六年级上册教案-全册
- 2024粤东西粤北地区教师全员轮训培训心得总结
- 服务类验收单
- MOOC 健身健美-北京林业大学 中国大学慕课答案
- 人生悟理-透过物理看人生智慧树知到期末考试答案2024年
- 教育信息化2.0时代教师新技能进阶智慧树知到期末考试答案2024年
- 国开2023年春《理工英语3》机考网考期末复习资料参考答案
- 中国古建筑行业分析报告
- 蜂产品订购合同范本
- 建筑工程杂填土基坑边坡支护方案及效果评价分析
评论
0/150
提交评论