




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、实验目的1掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构;2遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和宽度优先遍历算法,复习栈和队列的应用;3掌握图的各种应用的算法:图的连通性、连通分量和最小生成树、拓扑排序、关键路径。二、实验内容实验内容1*图的遍历问题描述许多涉及图上操作的算法都是以图的遍历为基础的。写一个程序,演示在连通无向图上遍历全部顶点。基本要求建立图的邻接表的存储结构,实现无向图的深度优先遍历和广度优先遍历。以用户指定的顶点为起点,分别输出每种遍历下的顶点访问序列。实现提示设图的顶点不超过30个,每个顶点用一个编号表示(如果一个图有N个顶点,则它们
2、的编号分别为1,2,N)。通过输入图的全部边输入一个图,每条边是两个顶点编号对,可以对边依附顶点编号的输入顺序作出限制(例如从小到大)。编程思路 首先图的创建,采用邻接表建立,逆向插入到单链表中,特别注意无向是对称插入结点,且要把输入的字符在顶点数组中定位(LocateVex(Graph G,char *name),以便后来的遍历操作,深度遍历算法采用递归调用,其中最主要的是NextAdjVex(Graph G, int v, int w) ;FirstAdjVex()函数的书写,依次递归下去,广度遍历用队列的辅助。程序代码 头文件:#include<stdio.h>#includ
3、e<stdlib.h>#define MAX_VERTEX_NUM 30#define MAX_QUEUE_NUMBER 30#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define TRUE 1#define FALSE 0typedef int Status;typedef int InfoType;typedef int Status;/* 定义弧的结构*/typedef struct ArcNode int adjvex; /*该边所指向的顶点的位置*/ struct ArcNode
4、 *nextarc; /*指向下一条边的指针*/ InfoType info; /*该弧相关信息的指针*/ArcNode; /*定义顶点的结构*/typedef struct VNode char data40; /*顶点信息*/ ArcNode *firstarc; /*指向第一条依附该顶点的弧的指针*/VNode,AdjListMAX_VERTEX_NUM;/*定义图的结构*/typedef struct AdjList vertices; int vexnum,arcnum; /*图的当前顶点数和弧数*/ int kind; /*图的类型标志*/Graph;/*定义队列的结构*/type
5、def structint *elem;int front, rear;Queue;/*功能选择*/void MenuSelect(int w);/*顶点定位*/int LocateVex(Graph G,char *name);/*创建无向图*/void CreateGraph(Graph &G);/*求第一个顶点*/int FirstAdjVex(Graph G, int v);/*求下一个顶点*/int NextAdjVex(Graph G, int v, int w);/*深度递归*/void DFS(Graph G, int v) ;/*深度遍历*/void DFSTrave
6、l(Graph G,int v);/*广度遍历*/void BFSTraverse(Graph G,char *name);/*初始化队列*/Status InitQueue(Queue &Q);/*判空*/Status EmptyQueue(Queue Q);/*进队*/Status EnQueue(Queue &Q, int e);/*出队*/Status DeQueue(Queue &Q, int &e);实现文件:#include <stdio.h>#include"malloc.h"#include "tuhe
7、ad.h"#include "stdlib.h"#include "string.h"bool visitedMAX_VERTEX_NUM;/* 顶点定位 */int LocateVex(Graph G,char *name)int i;for(i=1;i<=G.vexnum;i+) /从1号位置开始存储if(strcmp(name,G.verticesi.data)=0) /相等则找到,返回位序return i;return -1;/* 创建无向图 */void CreateGraph(Graph &G)ArcNode *p;c
8、har name110,name210;int i,j,k;printf(" 请输入顶点数,按回车键结束:");scanf("%d",&G.vexnum); printf(" 请输入弧数,按回车键结束:");scanf("%d",&G.arcnum);printf(" 请依次输入顶点名(用空格分开且字符小于10),按回车键结束:n"); printf(" ");for(i=1;i<=G.vexnum;i+) /从1号位置开始存储 scanf("
9、%s",G.verticesi.data); /从一号位置开始初始化G.verticesi.firstarc=NULL; printf("nnnn"); printf(" 输入小提示n"); printf(" &&&&1 为避免输入遗漏,最好从选择任意一点,输入所有相邻边n"); printf(" &&&&2 输入边时格式(用空格分开,即格式为顶点(空格)顶点(空格))n"); printf(" 输入小提示nnnn");f
10、or(k=0;k<G.arcnum;k+)printf("请输入相邻的两个顶点,按回车键结束:");scanf("%s%s",name1,name2);i=LocateVex(G,name1); /返回位序j=LocateVex(G,name2); p=(ArcNode *)malloc(sizeof(ArcNode); /申请边节点p->adjvex=j; /插入到邻接表中,注意此处为逆向插入到单链表中 p->nextarc=G.verticesi.firstarc;G.verticesi.firstarc=p; /无向图,注意是对称
11、插入结点 p=(ArcNode *)malloc(sizeof(ArcNode); p->adjvex=i; p->nextarc=G.verticesj.firstarc;G.verticesj.firstarc=p; /* 求第一个顶点 */ int FirstAdjVex(Graph G, int v) ArcNode *p; if(v>=1 && v<=G.vexnum) p=G.verticesv.firstarc; if(p->nextarc=NULL) return 0; else return (p->nextarc->
12、adjvex); /返回第一个顶点字符 return -1; /* 求下一个顶点 */int NextAdjVex(Graph G, int v, int w) /在图G中寻找第v个顶点的相对于w的下一个邻接顶点 ArcNode *p; if(v>=1 && v<=G.vexnum && w>=1 && w<=G.vexnum) p=G.verticesv.firstarc; while(p->adjvex!=w) p=p->nextarc; /在顶点v的弧链中找到顶点w if(p->nextarc!=N
13、ULL) return 0; /若已是最后一个顶点,返回0 else return(p->nextarc->adjvex); /返回下一个邻接顶点的序号 return -1;/* 深度递归 */void DFS(Graph G, int v) int w; ArcNode *p; visitedv=1; printf("%s ",G.verticesv.data); /访问第v个顶点 p=G.verticesv.firstarc; /p为依附顶点的第一条边 while (p!=NULL) w=p->adjvex; if(visitedw=0) DFS(G,
14、w); p=p->nextarc; /下移指针 /* 深度遍历 */void DFSTravel(Graph G,int v)for(int i=1;i<=G.vexnum;i+) visitedi=0; int w; ArcNode *p; visitedv=1; printf("%s ",G.verticesv.data); /访问第v个顶点 p=G.verticesv.firstarc; while (p!=NULL) w=p->adjvex; if(visitedw=0) DFS(G,w); p=p->nextarc; /* 初始化队列 */
15、 Status InitQueue(Queue &Q)Q.elem = new intMAX_QUEUE_NUMBER;Q.front = Q.rear = 0; return OK;Status EmptyQueue(Queue Q)if(Q.front=Q.rear)return 0;else return 1;/* 进队列 */Status EnQueue(Queue &Q, int e)if(Q.rear + 1)%MAX_QUEUE_NUMBER != Q.front)Q.elemQ.rear = e;else;Q.rear = (Q.rear + 1)%MAX_QU
16、EUE_NUMBER; return OK; /* 出队列 */Status DeQueue(Queue &Q, int &e)if(Q.rear != Q.front)e = Q.elemQ.front;else ;Q.front = (Q.front+1)%MAX_QUEUE_NUMBER; return OK;/* 广度遍历 */void BFSTraverse(Graph G,char *name)ArcNode *p;int v,w,u,k=0; Queue Q;int visited20;for(v=1;v<=G.vexnum;v+) /初始化visitedv
17、=0;InitQueue(Q);for(v=LocateVex(G,name);k!=2;v=(v+1)%(G.vexnum-1) /v为输入的字符转化的位序if(v+1=LocateVex(G,name) /从v开始走完图的所有顶点k+;if(visitedv=0)visitedv=1;printf("%s ",G.verticesv.data); /访问第v个顶点 EnQueue(Q,v); / 进队 while(EmptyQueue(Q)!=0)DeQueue(Q,u); /出队p=G.verticesu.firstarc;while(p!=NULL)w=p->
18、adjvex; /p边的下一个顶点if(visitedw=0)printf("%s ",G.verticesw.data);visitedw=1;EnQueue(Q,w);p=p->nextarc; /下移指针 主文件:#include <stdio.h>#include"malloc.h"#include "tuhead.h"#include "stdlib.h"#include "string.h"/* 界面控制 */void main() printf("n#
19、图的遍历 #n"); printf("n $n"); printf("n"); printf(" 1 - 图的创建n"); printf(" 2 - 图的深度优先遍历n"); printf(" 3 - 图的广度优先遍历n"); printf(" 0 - 退出n");printf("n$n"); printf("n"); printf("请输入选择的操作代码(0-3)按回车键结束n"); MenuSelect(1);/* 功能选择 */ void MenuSelect(int w) int select,done; int v; Gra
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 5617-2025钢件表面淬火硬化层深度的测定
- 2025自考专业(计算机应用)经典例题附参考答案详解【能力提升】
- 2025年自考专业(工商企业管理)高分题库附完整答案详解(各地真题)
- 执业药师资格证之《西药学专业一》预测复习含答案详解(基础题)
- 新生儿电解质紊乱纠正原则
- 房产抵押展期合同(标准版)
- 卸船合同(标准版)
- 事业单位联考题库试题及参考答案详解【能力提升】
- 2025年环境影响评价公众参与效果提升策略研究报告
- 2025年家庭教育指导服务市场策略分析报告:市场需求与竞争策略
- 专项安全施工方案监理
- 股东出资协议书合同
- 2025劳动合同书(示范文本)
- GB/T 27060-2025合格评定良好实践指南
- DB45∕T 2789-2023 壮医药线点灸治疗护理技术操作规范
- 分子诊断技术在感染性疾病中的应用-深度研究
- 行测5000题电子版2025
- 《规训与惩罚》课件
- 【MOOC】声乐作品赏析与演唱-扬州大学 中国大学慕课MOOC答案
- 2024年版机电产品国际招标标准招标文件
- 糖尿病高血压健康教育
评论
0/150
提交评论