图及其应用.docx
- 文档编号:29794192
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:16
- 大小:363.67KB
图及其应用.docx
《图及其应用.docx》由会员分享,可在线阅读,更多相关《图及其应用.docx(16页珍藏版)》请在冰豆网上搜索。
图及其应用
闽江学院电子系
实验报告
学生姓名:
曹韦
班级:
学号:
3142731
课程:
数据结构与算法
一、实验题目:
图及其应用
二、实验地点:
计算机软件与网络实验室-实验楼A210
三、实验目的:
1.熟练掌握图的两种存储结构(邻接矩阵和邻接表)的表示方法
2.掌握图的基本运算及应用
3.加深对图的理解,逐步培养解决实际问题的编程能力
四、实验内容:
利用邻接表存储结构,设计一种图(有向或无向),并能够对其进行如下操作:
1.建立图的邻接表算法
函数名:
GreateGraph()
操作结果:
采用邻接表存储结构,构造图G;
2.确定图的顶点数和弧数算法
函数名:
var_adjcount()
操作结果:
确定图G的结点数和弧(有向或无向)数;
3.邻接表表示的图的递归深度优先遍历的算法
函数名:
DFSTraverse(intv)
操作结果:
返回图从某个结点开始的按深度优先遍历的结果;
4.邻接表表示的图的广度优先遍历的算法
函数名:
BFSTraverse(intv)
操作结果:
返回图从某个结点开始的按广度优先遍历的结果;
五、实验环境(使用的软硬件):
利用VisualC++集成开发环境进行本实验的操作
六、实验步骤及操作:
1.用一维数组存储顶点信息,用链接矩阵存储顶点间关系信息的图或网的形
式描述下:
#include
#include
#include
#defineMAXSIZE20//最大顶点数
#defineuintunsignedint
intcount,t,c[MAXSIZE];
typedefstructnode//定义表结构体类型
{
intadjvex,info;
structnode*next;//指向下一个结点的指针
}nodetype;
typedefstructfrontnode//定义表头结点类型
{
chardata;
structnode*next;//链域,指向单链表第一个结点
}frontnodetype;
frontnodetypeadjlist[MAXSIZE];
2.开始界面设计
//开始界面
voidStart_Screen()
{
printf("\n\n\n");
printf("\t********************************\t\n");
printf("\t**\t\n");
printf("\t**\t\n");
printf("\t******Welcometo图的应用******\t\n");
printf("\t**\t\n");
printf("\t**\t\n");
printf("\t**\t\n");
printf("\t*1.建立图的邻接表*\t\n");
printf("\t**\t\n");
printf("\t*2.输出图的顶点数和弧数*\t\n");
printf("\t**\t\n");
printf("\t*3.深度优先遍历图*\t\n");
printf("\t**\t\n");
printf("\t*4.广度优先遍历图*\t\n");
printf("\t**\t\n");
printf("\t*5.退出系统*\t\n");
printf("\t**\t\n");
printf("\t********************************\t\n");
printf("\t*请输入您的选择选择:
");scanf("%d",&t);
printf("\n");
}
3.编写图的基本操作函数描述如下:
//建立图的邻接表算法
voidGreateGraph()
{
nodetype*p,*q;
charch;
inti=1,adj,we;
printf("请输入该图的所有顶点,以‘#’结束:
\n");
scanf("\n%c",&ch);
while(ch!
='#')
{
adjlist[i].data=ch;
adjlist[i].next=NULL;
i++;
ch=getchar();
}
count=i-1;
if(count>=MAXSIZE)
{
printf("您输入的顶点数过多!
!
!
\n");
exit(0);
}
for(i=1;i<=count;i++)
{
p=(nodetype*)malloc(sizeof(nodetype));
p->next=NULL;
adjlist[i].next=p;
printf("请输入第%d个顶点的邻接点域,数据域,以‘-1,-1’结束(注意数与数以空格隔开):
\n",i);
scanf("%d,%d",&adj,&we);
while(adj!
=-1)
{
q=(nodetype*)malloc(sizeof(nodetype));
q->adjvex=adj;
q->info=we;
q->next=NULL;
p->next=q;
p=p->next;
scanf("%d,%d",&adj,&we);
}
p=adjlist[i].next;
adjlist[i].next=p->next;
free(p);
}
}
//确定图的顶点数和弧数算法
voidvar_adjcount()
{
nodetype*p,*q;
inti,v,e=0;
for(i=1;i<=count;i++)
{
p=adjlist[i].next;
while(p!
=NULL)
{
e++;
p=p->next;
}
}
p=adjlist[1].next;
v=p->adjvex;
q=adjlist[v].next;
if(adjlist[q->adjvex].data==adjlist[1].data)e=e/2;
printf("该图的顶点数为%d,弧数为%d",count,e);
}
//邻接表表示的图的递归深度优先遍历的算法
voidDFSTraverse(intv)
{
inti;//标志数组初始化
nodetype*p;
c[v]=1;
printf("%c",adjlist[v].data);
for(p=adjlist[v].next;p!
=NULL;p=p->next)//从v的第一个邻接顶点开始
{
i=p->adjvex;
if(c[i]==0)
{
printf("->");
DFSTraverse(i);
}
}
printf("\n");
for(i=1;i<=count;i++)
if(c[i]==0)DFSTraverse(i);
printf("\n\n\n\n\n");
}
//邻接表表示的图的广度优先遍历的算法
voidBFSTraverse(intv)
{
nodetype*p;
inti;
intrear=0,front=0,c[MAXSIZE]={0},q[MAXSIZE];
for(i=1;i<=count;i++)c[i]=0;
c[v]=1;
printf("%c",adjlist[v].data);
q[++front]=v;
while(front>rear)
{
rear=(rear+1)%MAXSIZE;
v=q[rear];
p=adjlist[v].next;
while(p!
=NULL)
{
v=p->adjvex;
if(c[v]==0)
{
c[v]=1;
printf("->%c",adjlist[v].data);
front=(front+1)%MAXSIZE;
q[front]=v;
}
p=p->next;
}
}
for(i=1;i<=count;i++)
if(c[i]==0)
{
c[i]=1;
printf("%c",adjlist[i].data);
q[++front]=i;
while(front>rear)
{
rear=(rear+1)%MAXSIZE;
v=q[rear];
p=adjlist[i].next;
while(p!
=NULL)
{
v=p->adjvex;
if(c[v]==0)
{
c[v]=1;
printf("->%c",adjlist[v].data);
front=(front+1)%MAXSIZE;
q[front]=v;
}
p=p->next;
}
}
}
}
4.主函数的描述如下:
voidmain()
{
intv,i;
Start_Screen();
if(t!
=1)
{
printf("\t\t\t\a请先建立图的邻接表!
\n");
Start_Screen();
}
while
(1)
{
switch(t)
{
case1:
GreateGraph();//建立图的邻接表算法
break;
case2:
var_adjcount();//确定图的顶点数和弧数算法
break;
case3:
printf("请输入您要进行深度优先遍历的开始顶点序号:
");
scanf("%d",&v);
for(i=1;i<=count;i++)c[i]=0;
DFSTraverse(v);//邻接表表示的图的递归深度优先遍历的算法
break;
case4:
printf("请输入您要进行广度优先遍历的开始顶点序号:
");
scanf("%d",&v);
BFSTraverse(v);//邻接表表示的图的广度优先遍历的算法
break;
case5:
exit(0);
break;
default:
putchar('\a');
system("cls");//清屏
Start_Screen();
}
Start_Screen();
}
}
七、实验结果:
1.有向图G1测试:
(a)有向图G1G1的邻接矩阵
G1的邻接表
(1)图的顶点数和弧数
顶点数:
6弧数:
8
(2)图的递归深度优先遍历
输入:
A(从A结点开始的深度优先遍历)
预期输出:
A-﹥B-﹥E-﹥C-﹥D-﹥F
(3)图的非递归广度优先遍历
输入:
C(从C结点开始的广度优先遍历)
预期输出:
C-﹥D-﹥F-﹥E-﹥A-﹥B
实验结果:
输入图G1的所有顶点:
输入各个顶点的邻接结点:
输出图的顶点数和弧数:
从A结点开始的深度优先遍历:
从C结点开始的广度优先遍历:
退出系统:
2.无向图G2测试:
(b)无向图G2邻接矩阵
邻接表
(1)图的顶点数和弧数
顶点数:
5弧数:
8
(2)图的递归深度优先遍历
输入:
D(从D结点开始的深度优先遍历)
预期输出:
D-﹥A-﹥B-﹥C-﹥E
(3)图的非递归广度优先遍历
输入:
A(从A结点开始的广度优先遍历)
预期输出:
A-﹥B-﹥C-﹥D-﹥E
实验结果:
建立图G2的邻接表:
输出图G2的顶点数和弧数:
深度遍历图G2:
广度遍历图G2:
八、实验总结及心得体会:
本次实验使自己加深了对图的理解,能够掌握图的基本运算,加深了对编程的浓厚兴趣,能够根据错误或警告找出问题的所在并修改,进一步熟练的掌握调试技术。
九、对本实验过程及方法、手段的改进建议:
在这次实验中没有深入对图的运算进行操作,如删除图的结点,用广度优先搜索或深度优先搜索方法找出从一顶点到另一顶点边数最少的路径等。
因此还有待于对图的其他操作进行应用。
报告评分:
指导教师签字:
批阅日期:
注意:
●实验报告以纸质文档形式上交。
实验报告将记入平时成绩;
●每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 及其 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)