1、数据结构08图的基本操作附录 实验报告参考规范数据结构实验报告院系_ 专业 _网络工程_姓名_林桢曦_ 学号_106052010235_ 电话_ _级 _班 _年_月_日1实验题目 图的基本操作2需求分析 编写图基本操作函数,建立图的邻接表,邻接矩阵。邻接表表示的图的递归深度优先遍历,邻接矩阵表示的图的递归深度优先遍历,邻接表表示的图的广度优先遍历,邻接矩阵表示的图的广度优先遍历。并调用上述函数实现相关操作。3概要设计(1) 为了实现上述程序功能,需要定义一个简化的线性表抽象数据类型:ADT Graph 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集 数据关系R:R=VRVR=|v,
2、wV且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息 基本操作: Create_Graph(LGraph lg,MGraph mg) 操作前提:lg是一个邻接表表示的图,mg是一个邻接矩阵表示的图 操作结果:建立图的邻接表,邻接矩阵 LDFS(LGraph g,int i) 操作前提:g是一个已初始化的邻接表表示的图 操作结果:对图g进行递归深度优先遍历 MDFS(MGraph g,int i,int vn) 操作前提:g是一个已初始化的邻接矩阵表示的图 操作结果:对图进行递归深度优先遍历 LBFS(LGraph g,int s,int n) 操作前提:g是一个已初始化
3、的邻接表表示的图 操作结果:对图进行递归深度优先遍历 MBFS(MGraph g,int s,int n) 操作前提:g是一个已初始化的邻接矩阵表示的图 操作结果:对图进行递归深度优先遍历(2) 本程序包含6个函数: 主函数main() 建立图的邻接表,邻接矩阵函数Create_Graph() 邻接表表示的图的递归深度优先遍历函数LDFS() 邻接矩阵表示的图的递归深度优先遍历函数MDFS() 邻接表表示的图的广度优先遍历LBFS() 邻接矩阵表示的图的广度优先遍历MBFS()各函数间调用关系如下:主函数调用其他函数(3) 主函数的伪码main()定义变量LGraph lg;MGraph mg
4、;int n,i;令n=Create_Graph(lg,mg);For循环(i=0;in;i+)visitedi=0;printf(n邻接表表示的图的递归深度优先遍历n);调用LDFS(lg,0);getch();For循环(i=0;in;i+)visitedi=0;printf(n邻接矩阵表示的图的递归深度优先遍历n);调用MDFS(mg,0,n);getch();printf(n邻接表表示的图的广度优先遍历n);调用LBFS(lg,0,n);getch();printf(n邻接矩阵表示的图的广度优先遍历n);调用MBFS(mg,0,n); 4详细设计(1) 类型定义typedef stru
5、ct node int vno;struct node *next;EdgeNode;typedef EdgeNode *LGraphMAX;typedef int MGraphMAXMAX;基本操作的伪码算法1.建立图的邻接表,邻接矩阵Create_Graph(LGraph lg,MGraph mg) 定义变量int vn,en,k,i,j;EdgeNode *p;While循环(1)vn=en=0;printf(输入图的顶点数1-10n);调用fflush(stdin);scanf(%d,&vn);如果(vn10)continue;printf(输入图的边数0-%dn,vn*(vn-1)/
6、2);scanf(%d,&en);如果(en=0&en=vn*(vn-1)/2)break;For循环(k=0;kvn;k+)lgk=NULL;For循环(k=0;kvn;k+)For循环(i=0;ivn;i+)mgki=0;For循环(k=0;ken;)i=j=-1;printf(输入一对相连的两条边1-%d的顶点:,vn);scanf(%d%d,&i,&j);如果(i1|jvn|jvn)printf(输入错误,边范围为1-%dn,vn);继续;k+;i-;j-;p=(EdgeNode *)malloc(sizeof(EdgeNode);p-vno=j;p-next=lgi;lgi=p;p=
7、(EdgeNode *)malloc(sizeof(EdgeNode);p-vno=i;p-next=lgj;lgj=p;mgij=mgji=1;返回 vn;2.递归深度优先遍历输出图的邻接表 LDFS(LGraph g,int i)定义变量EdgeNode *t;printf(%4d,i+1);visitedi=1;t=gi;While循环(t!=NULL)如果(visitedt-vno=0)调用LDFS(g,t-vno);t=t-next;3.递归深度优先遍历输出图的邻接矩阵 MDFS(MGraph g,int i,int vn)定义变量int j;printf(%4d,i+1);visi
8、tedi=1;For循环(j=0;jvn;j+)如果(gij=1&visitedj=0)调用MDFS(g,j,vn);4.图的广度优先遍历输出图的邻接表LBFS(LGraph g,int s,int n)定义变量int i,v,w,head,tail;EdgeNode *t;For循环(i=0;in;i+)visitedi=0;head=tail=0;输出(%4d,s+1);visiteds=1;queuetail=s;While循环(headnext)w=t-vno;如果(visitedw=0)输出(%4d,w+1);visitedw=1;queuetail+=w;5.图的广度优先遍历输出图
9、的邻接矩阵MBFS(MGraph g,int s,int n)定义变量int i,j,v,head,tail;For循环(i=0;in;i+)visitedi=0;head=tail=0;输出(%4d,s+1);visiteds=1;queuetail+=s;While循环(headtail)v=queuehead+;For循环(j=0;jn;j+)如果(gvj=1&visitedj=0)输出(%4d,j+1);visitedj=1;queuetail+=j;5调试分析调试中遇到分号在中文输入情况下输入,调试不通过,还有空指针问题。(略)6使用说明按要求输入图的顶点数,在输入图的边数,接着输入
10、相连两条边的顶点,输入范围屏幕有显示,最后屏幕显示四种遍历结果。7测试结果8. 参考文献数据结构9附录源程序文件如下:#include stdio.h#include stdlib.h#include conio.h#define MAX 10typedef struct node int vno;struct node *next;EdgeNode;typedef EdgeNode *LGraphMAX;typedef int MGraphMAXMAX;int visitedMAX;int queueMAX;int Create_Graph(LGraph lg,MGraph mg)int v
11、n,en,k,i,j;EdgeNode *p;while(1)vn=en=0;printf(输入图的顶点数1-10n);fflush(stdin);scanf(%d,&vn);if(vn10)continue;printf(输入图的边数0-%dn,vn*(vn-1)/2);scanf(%d,&en);if(en=0&en=vn*(vn-1)/2)break;for(k=0;kvn;k+)lgk=NULL;for(k=0;kvn;k+)for(i=0;ivn;i+)mgki=0;for(k=0;ken;)i=j=-1;printf(输入一对相连的两条边1-%d的顶点:,vn);scanf(%d%
12、d,&i,&j);if(i1|jvn|jvn)printf(输入错误,边范围为1-%dn,vn);continue;k+;i-;j-;p=(EdgeNode *)malloc(sizeof(EdgeNode);p-vno=j;p-next=lgi;lgi=p;p=(EdgeNode *)malloc(sizeof(EdgeNode);p-vno=i;p-next=lgj;lgj=p;mgij=mgji=1;return vn;void LDFS(LGraph g,int i)EdgeNode *t;printf(%4d,i+1);visitedi=1;t=gi;while(t!=NULL)if
13、(visitedt-vno=0)LDFS(g,t-vno);t=t-next;void MDFS(MGraph g,int i,int vn)int j;printf(%4d,i+1);visitedi=1;for(j=0;jvn;j+)if(gij=1&visitedj=0)MDFS(g,j,vn);void LBFS(LGraph g,int s,int n)int i,v,w,head,tail;EdgeNode *t;for(i=0;in;i+)visitedi=0;head=tail=0;printf(%4d,s+1);visiteds=1;queuetail=s;while(hea
14、dnext)w=t-vno;if(visitedw=0)printf(%4d,w+1);visitedw=1;queuetail+=w;void MBFS(MGraph g,int s,int n)int i,j,v,head,tail;for(i=0;in;i+)visitedi=0;head=tail=0;printf(%4d,s+1);visiteds=1;queuetail+=s;while(headtail)v=queuehead+;for(j=0;jn;j+)if(gvj=1&visitedj=0)printf(%4d,j+1);visitedj=1;queuetail+=j;vo
15、id main()LGraph lg;MGraph mg;int n,i;n=Create_Graph(lg,mg);for(i=0;in;i+)visitedi=0;printf(n邻接表表示的图的递归深度优先遍历n);LDFS(lg,0);getch();for(i=0;in;i+)visitedi=0;printf(n邻接矩阵表示的图的递归深度优先遍历n);MDFS(mg,0,n);getch();printf(n邻接表表示的图的广度优先遍历n);LBFS(lg,0,n);getch();printf(n邻接矩阵表示的图的广度优先遍历n);MBFS(mg,0,n); 注意事项: 每位同学必须完成实验任务,并提交实验报告。杜绝抄袭和拷贝,一经发现该次实验雷同报告均以零分计。 请将实验报告以电子文档提交, “网络工程”专业请发送到fjsdwlgc信箱中,“电子信息”专业请发送到fjsddzxx 信箱中,请附上程序清单.C源程序文件、和实验报告WORD文档两部分,以打包压缩文件形式提交,每次实验为一个文件夹的打包压缩文件,文件夹名统一为*?.rar或*?.zip,其中*为你的学号(全部号码),为你中文姓名,?分别为01,02,0311表示第几次实验。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1