数据结构实验报告无向图
更新时间:2023-11-14 00:54:01 阅读量: 教育文库 文档下载
《数据结构》实验报告
◎实验题目: 无向图的建立与遍历
◎实验目的:掌握无向图的邻接链表存储,熟悉无向图的广度与深度优先遍历。 ◎实验内容:对一个无向图以邻接链表存储,分别以深度、广度优先非递归遍历输出。 一、需求分析
1.本演示程序中,输入的形式为无向图的邻接链表形式,首先输入该无向图的顶点数和边数,接着输入顶点信息,再输入每个边的顶点对应序号。 2.该无向图以深度、广度优先遍历输出。
3.本程序可以实现无向图的邻接链表存储,并以深度、广度优先非递归遍历输出。 4.程序执行的命令包括:(1)建立一个无向图的邻接链表存储(2)以深度优先遍历输出 (3)以广度优先遍历输出(4)结束 5.测试数据:
a b c d f e
顶点数和边数:6,5
顶点信息:a b c d e f 边的顶点对应序号: 0,1 0,2 0,3 2,4
3,4
深度优先遍历输出: a d e c b f
广度优先遍历输出: a d c b e f
二 概要设计
为了实现上述操作,应以邻接链表为存储结构。 1.基本操作:
void createalgraph(algraph &g) 创建无向图的邻接链表存储
void dfstraverseal(algraph &g,int v)
以深度优先遍历输出
void bfstraverseal(algraph &g,int v) 以广度优先遍历输出
2.本程序包含四个模块: (1)主程序模块
(2)无向图的邻接链表存储模块 (3)深度优先遍历输出模块 (4)广度优先遍历输出模块 3.模块调用图:
主程序模块 无向图的邻接链表存储模块 三 详细设计
1.元素类型,结点类型和指针类型: typedef struct node {
int adjvex;
struct node *next;
深度优先遍历输出模块 广度优先遍历输出模块
}edgenode;
typedef struct vnode {
char vertex;
edgenode *firstedge;
}vertxnode;
typedef vertxnode Adjlist[maxvernum]; typedef struct {
Adjlist adjlist; int n,e; }algraph;
edgenode *s;
edgenode *stack[maxvernum],*p; 2.每个模块的分析: (1)主程序模块 int main()
{ }
(2)无向图的邻接链表存储模块 void createalgraph(algraph &g) {
int i,j,k;
edgenode *s;
printf(\请输入顶点数和边数(输入格式为:顶点数,边数):\\n\
scanf(\读入顶点数和边数*/ getchar();
printf(\请输入顶点信息(输入格式为:(顶点号(CR))):\\n\for(i=0;i g.adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/ int v=0; algraph g; createalgraph(g); printf(\以深度优先遍历输出\\n\dfstraverseal(g,v); printf(\以广度优先遍历输出\\n\bfstraverseal(g,v); getchar(); getchar(); return 0; printf(\请输入边的信息(输入格式为:i,j):\\n\for(k=0;k scanf(\读入边(vi,vj)的顶点对应序号*/ s=(edgenode *)malloc(sizeof(edgenode)); /*生成新边表节点s*/ s->adjvex=j; /*邻接点序号为j*/ s->next=g.adjlist[i].firstedge; /*将新边表节点s插入到顶点vi的边表头g.adjlist[i].firstedge=s; s=(edgenode *)malloc(sizeof(edgenode)); /*生成新边表节点s*/ s->adjvex=i; /*邻接点序号为i*/ s->next=g.adjlist[j].firstedge; /*将新边表节点s插入到顶点vj的边表头g.adjlist[j].firstedge=s; 部*/ 部*/ } } (3)深度优先遍历输出模块 void dfstraverseal(algraph &g,int v) { int j=0; edgenode *stack[maxvernum],*p; int visited[maxvernum],top=-1,i; for(i=0;i i=0; while(visited[i]==1) { i++; }v=i; printf(\访问图的指定起始顶点v*/ j++; p=g.adjlist[v].firstedge; visited[v]=1; while(top>=0||p!=NULL) { while(p!=NULL) if(visited[p->adjvex]==1) p=p->next; else { printf(\从v出发访问一个与v邻接的p所指的顶点*/ } j++; visited[p->adjvex]=1; top++; stack[top]=p; /*将p所指的顶点入栈*/ p=g.adjlist[p->adjvex].firstedge; /*从p所指顶点出发*/ } if(top>=0) { p=stack[top]; /*退栈,回溯查找已被访问节点的未被访问过 的邻接点*/ top--; p=p->next; } printf(\ } }(4)广度优先遍历输出模块 void bfstraverseal(algraph &g,int v) { int i,front=-1,rear=-1,j=0; edgenode *p; for(i=0;i i=0; while(visited[i]==1) { i++; } v=i; visited[v]=1; printf(\j++; rear++; queue[rear]=v; /*初始顶点入队*/ while(front!=rear) /*队列不为空*/ { } printf(\ front=front+1; v=queue[front]; /*按访问次序出队列*/ p=g.adjlist[v].firstedge; /*找v的邻接顶点*/ while(p!=NULL) { } if(visited[p->adjvex]==0) { visited[p->adjvex]=1; printf(\ j++; rear=rear+1; queue[rear]=p->adjvex; } p=p->next; } 3.函数调用图: int main() void void createalgraph(aldfstraverseal(agraph &g) lgraph &g,int v) 4.完整的程序:(见源文件)。 四 使用说明、测试分析及结果 1.程序使用说明 (1)本程序的运行环境为VC6.0。 (2)进入演示程序后即显示提示信息: 请输入顶点数和边数(输入格式为:顶点数,边数): 请输入顶点信息(输入格式为:(顶点号(CR))): 请输入边的信息(输入格式为:i,j): 2.测试数据: a b c d e 顶点数和边数:6,5 顶点信息:a b c d e f 边的顶点对应序号: 0,1 0,2 0,3 2,4 3,4 深度优先遍历输出: a d e c b f 广度优先遍历输出: void bfstraverseal(algraph &g,int v) f a d c b e f 3.运行界面: 五、实验总结 本次程序由于书上有相关程序作为参考,所以编写起来比较顺手,通过本次编程,对于无向图的邻接链表存储有了一定的基础,同时还熟练掌握了无向图的深度、广度优先遍历输出,中间由于要存储无向不连通图,出了点小问题,在自己的努力下和同学的帮助下,完成了无向不连通图的存储与遍历输出。通过本次试验对于无向图有了更深的了解,可以很好地掌握它的建立与遍历输出。 教师评语: #include int adjvex; struct node *next; }edgenode; typedef struct vnode { char vertex; edgenode *firstedge; }vertxnode; typedef vertxnode Adjlist[maxvernum]; typedef struct { Adjlist adjlist; int n,e; }algraph; int visited[maxvernum]; int queue[maxvernum]; //创建无向图 void createalgraph(algraph &g) { int i,j,k; edgenode *s; printf(\请输入顶点数和边数(输入格式为:顶点数,边数):\\n\scanf(\读入顶点数和边数*/ getchar(); printf(\请输入顶点信息(输入格式为:(顶点号(CR))):\\n\for(i=0;i scanf(\读入顶点信息*/ getchar(); g.adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/ } printf(\请输入边的信息(输入格式为:i,j):\\n\ for(k=0;k s->adjvex=j; /*邻接点序号为j*/ s->next=g.adjlist[i].firstedge; /*将新边表节点s插入到顶点vi的边表头g.adjlist[i].firstedge=s; s=(edgenode *)malloc(sizeof(edgenode)); /*生成新边表节点s*/ s->adjvex=i; /*邻接点序号为i*/ s->next=g.adjlist[j].firstedge; /*将新边表节点s插入到顶点vj的边表头g.adjlist[j].firstedge=s; 部*/ 部*/ } } //深度优先 void dfstraverseal(algraph &g,int v) { int j=0; edgenode *stack[maxvernum],*p; int visited[maxvernum],top=-1,i; for(i=0;i while(j!=g.n) { i=0; while(visited[i]==1) { i++; }v=i; printf(\访问图的指定起始顶点v*/ j++; p=g.adjlist[v].firstedge; visited[v]=1; while(top>=0||p!=NULL) { while(p!=NULL) if(visited[p->adjvex]==1) p=p->next; else { printf(\\从v出发 访问一个与v邻接的p所指的顶点*/ j++; visited[p->adjvex]=1; top++; stack[top]=p; /*将p所指的顶点入栈*/ p=g.adjlist[p->adjvex].firstedge; /*从p所指顶点出发*/ } if(top>=0) { p=stack[top]; /*退栈,回溯查找已被访问节点的未被访问 过的邻接点*/ } } } top--; p=p->next; } printf(\ //广度优先 void bfstraverseal(algraph &g,int v) { int i,front=-1,rear=-1,j=0; edgenode *p; for(i=0;i } while(j!=g.n) { } i=0; while(visited[i]==1) { } i++; v=i; visited[v]=1; printf(\j++; rear++; queue[rear]=v; /*初始顶点入队*/ while(front!=rear) /*队列不为空*/ { front=front+1; v=queue[front]; /*按访问次序出队列*/ p=g.adjlist[v].firstedge; /*找v的邻接顶点*/ while(p!=NULL) { } if(visited[p->adjvex]==0) { visited[p->adjvex]=1; printf(\ j++; rear=rear+1; queue[rear]=p->adjvex; } p=p->next; } printf(\ int main() { int v=0; algraph g; createalgraph(g); printf(\以深度优先遍历输出\\n\dfstraverseal(g,v); printf(\以广度优先遍历输出\\n\bfstraverseal(g,v); getchar(); } getchar(); return 0;
正在阅读:
数据结构实验报告无向图11-14
参观农场作文600字06-23
一件有趣的事情作文600字06-20
党支部书记培训讲义2011090709-14
妈妈的手作文350字07-15
高考英语二轮复习第一部分题型专题方略专题四语法填空和短文改错02-29
泪水换来的水饺作文500字06-26
老家的枫树作文700字06-19
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 无向
- 数据结构
- 实验
- 报告
- 2019高考数学模拟题名师精编100题(高考数学考点全覆盖含答案)
- 李老文章 - 图文
- 信息检索 - 专业信息素养训练综合检索报告(A版)
- 完整英语语法知识树-孔子学府秦潇 - 图文
- 三违界定
- 用舌头判断脾胃虚弱的方法及健脾胃的食物
- DF8B故障处理 - 图文
- Cometd - push
- 《出师表》教学设计与反思
- 自考—微型计算机原理与接口技术试04年4月
- 职工食堂上半年安全工作总结
- 材 料 力 学 实 验 报 告1
- 三(5)家长会安排
- 地产项目免责文字说明汇总
- 楼梯设计步骤及例题
- 某生态保护治理植被恢复项目施工组织设计
- 西南大学网络学院2019秋1195平时作业辅导答案
- 2012大学物理最新版本习题册(ok)
- 电解分析法和库仑分析法
- 第三学段教材课后习题的运用1