数据结构实验十一:图实验Word格式.doc
- 文档编号:14180783
- 上传时间:2022-10-19
- 格式:DOC
- 页数:5
- 大小:94KB
数据结构实验十一:图实验Word格式.doc
《数据结构实验十一:图实验Word格式.doc》由会员分享,可在线阅读,更多相关《数据结构实验十一:图实验Word格式.doc(5页珍藏版)》请在冰豆网上搜索。
B,深度优先遍历该图的结点
C,判断任意两结点间是否存在路径
(2)本程序包含6个函数:
a,主函数main()
b,用邻接表建立图函数create_adjlistgraph()
c,深度优先搜索遍历函数dfs()
d,初始化遍历数组并判断有无通路函数dfs_trave()
e,输出邻接表函数print()
f,释放邻接表结点空间函数freealgraph()
各函数间关系如右图所示:
create_adjlistgraph()
dfs()
dfs_trave()
main()
print()
freealgraph()
四,详细设计
(1)邻接表中的结点类型定义:
typedefstructarcnode{
intadjvex;
arcnode*nextarc;
}arcnode;
(2)邻接表中头结点的类型定义:
typedefstruct{
charvexdata;
arcnode*firstarc;
}adjlist;
(3)邻接表类型定义:
typedefstruct{
adjlistvextices[max];
intvexnum,arcnum;
}algraph;
(4)深度优先搜索遍历函数伪代码:
intdfs(algraph*alg,inti,intn){
arcnode*p;
visited[i]=1;
p=alg->
vextices[i].firstarc;
while(p!
=NULL){if(visited[p->
adjvex]==0){
if(p->
adjvex==n){flag=1;
}
dfs(alg,p->
adjvex,n);
if(flag==1) return1;
}
p=p->
nextarc;
return0;
}
(5)初始化遍历数组并判断有无通路函数伪代码:
voiddfs_trave(algraph*alg,intx,inty){
inti;
for(i=0;
i<
=alg->
vexnum;
i++)visited[i]=0;
dfs(alg,x,y);
}
五,源代码
#include"
stdio.h"
stdlib.h"
malloc.h"
#definemax100
typedefstructarcnode{//定义邻接表中的结点类型
//定点信息
//指向下一个结点的指针nextarc
typedefstruct{//定义邻接表中头结点的类型
//头结点的序号
//定义一个arcnode型指针指向头结点所对应的下一个结点
typedefstruct{//定义邻接表类型
//定义表头结点数组
//定点个数和弧的个数
algraph*create_adjlistgraph(){//建立邻接表函数
intn,e,i,j,k;
arcnode*p;
//定义一个邻接表结点型指针变量p
algraph*al;
//定义邻接表表头结点指针al
al=(algraph*)malloc(sizeof(algraph));
//为邻接表结点申请空间
printf("
请输入节点数:
\n"
);
scanf("
%d"
&
n);
//输入结点数
for(i=0;
=n;
i++){
al->
vextices[i].vexdata=(char)i;
//给头结点赋值
vextices[i].firstarc=NULL;
//初始化头结点
}
请输入边数:
e);
//输入边得数目
请输入弧的信息:
e;
printf("
请输入边得两个结点:
"
scanf("
%d%d"
j,&
k);
//输入边的两个结点
p=(arcnode*)malloc(sizeof(arcnode));
//申请新的结点
p->
adjvex=k;
//将k赋值给新申请的结点
nextarc=al->
vextices[j].firstarc;
//使新结点指向该头结点所指向的下一个结点
vextices[j].firstarc=p;
//使头结点指向新结点
al->
vexnum=n;
//将顶点数n给al->
vexnum
arcnum=e;
//将边数e给al->
arcnum
returnal;
//返回该邻接表
}
voidprint(algraph*alg){//输出邻接表
inti;
//定义一个邻接表结点型指针变量p
该图的邻接表输出为:
for(i=1;
i++){//当在结点个数范围内时
printf("
%d-"
alg->
vextices[i].vexdata);
//输出i头结点的值
p=alg->
//把i头结点所指的第一个结点给p
while(p!
=NULL){//当p不为空时
printf("
p->
adjvex);
//输出给结点
p=p->
//p指向下一个结点
}
--\n"
}}
voidfreealgraph(algraph*alg){//释放邻接表结点空间函数
arcnode*p,*q;
//定义两个邻接表结点型指针变量p,q
i++){//当结点个数不超出范围时
//p指向i头结点所对应的第一个结点
=NULL){//当p不为空时
q=p->
//q指向p的下一个结点
free(p);
//释放p
p=q;
//将q赋给p
}
intvisited[max];
//定义深度优先搜索遍历数组
intflag=0;
//设置标志,用来判断两点间是否为通路
intdfs(algraph*alg,inti,intn){//深度优先搜索遍历函数
//定义邻接表结点类型指针p
visited[i]=1;
//将顶点i设置为已访问
p=alg->
//使p指向i头结点所指的第一个结点
while(p!
=NULL)//当p不为空时
{
if(visited[p->
adjvex]==0)//如果p结点未被访问
{
adjvex==n)//如果n=p结点的值
{
flag=1;
//则将标志位设置为1
}
//递归调用深度优先搜索遍历函数
if(flag==1)//如果已被访问
return1;
//则返回1
//p指向下一个结点
voiddfs_trave(algraph*alg,intx,inty){//初始化遍历数组并判断有无通路函数
i++)
visited[i]=0;
intmain(){//主函数
intm,n;
algraph*alg;
alg=create_adjlistgraph();
//创建图
print(alg);
//输出该图
请输入任意要判定有无通路的两个顶点(输入(-1-1)时退出):
m,&
while(m!
=-1&
&
n!
=-1){
dfs_tra
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 十一
![提示](https://static.bdocx.com/images/bang_tan.gif)