#include"c2.h"
#include"c3.h"
#include"c1.h"
int chose()
{
int i;
printf("*******************************\n");
printf("* 试验五 无向图的遍历 *\n");
printf("*******************************\n");
printf(" 1、创建邻接表 \n");
printf(" 2、深度优先遍历 \n");
printf(" 3、广度优先遍历 \n");
printf(" 4、退出 \n");
printf("*******************************\n");
printf("请选择:");
fflush(stdin);
scanf("%d",&i);
return i;
}
int LocateVex(ALGraph G,VertexType u)
{//返回顶点u在图中的位置
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vertices[i].data)==0)
return i;
return -1;
}
void CreateGraph(ALGraph &G)
{//建图
int i,j,k;
char c;
ElemType e;
VertexType v1,v2;
printf("请输入图的顶点数,边数:");
scanf("%d%c%d",&G.vexnum,&c,&G.arcnum);
printf("请输入%d个顶点的值(10个字符):\n",G.vexnum);
for(i=1;i<=G.vexnum;i++){//输入顶点值
printf("请输入第%d个顶点的值:",i);
scanf("%s",&G.vertices[i-1].data);
G.vertices[i-1].firstarc=NULL;//初始化边
}
for(i=1;i<=G.arcnum;i++){//输入边
printf("输入第%d条边的弧尾和弧头(以空格作为间隔):",i);
scanf("%s%s",v1,v2);
j=LocateVex(G,v1);//求v1的在图中的位置
k=LocateVex(G,v2);//求v2的在图中的位置
e.adjvex=k;
ListInsert(G.vertices[j].firstarc,1,e);
e.adjvex=j;
ListInsert(G.vertices[k].firstarc,1,e);
}
printf("各顶点的邻接点为:\n");
for(i=0;i<G.vexnum;i++){
printf("G.vertices[%d]=%s :",i,G.vertices[i].data);//每个点都是头结点
LinkList p = G.vertices[i].firstarc;
while(p){//结点存在,打出每个顶点的邻接点
printf("%s ",G.vertices[p->data.adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
int visited[MAX_VERTEX_NUM];//全局变量
void DFSTraverse(ALGraph G)//深度优先遍历
{
int i,v;
char V[MAX_NAME];
for(i=0;i<G.vexnum;i++)
visited[i]=0;
printf("请输入起始结点:");
scanf("%s",&V);
v=LocateVex(G,V);
printf("深度优先搜索结果为:\n");
DFS(G,v);//v-1为v点在图中的位置
for(i=0;i<G.vexnum;i++){
if(visited[i]==0)
DFS(G,i);
}
printf("\n");
}
void DFS(ALGraph G,int v)
{
int w;
visited[v]=1;
printf("%s ",G.vertices[v].data);//打印结点
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){
if(visited[w]==0)//如果标志结点为0则遍历该结点
DFS(G,w);
}
}
int FirstAdjVex(ALGraph G,int v)
{
LinkList p;
p=G.vertices[v].firstarc;
if(!p)
return -1;//如果不存在v点的邻接点则返回负数
else
return p->data.adjvex;//返回邻接点所在的位置
}
int NextAdjVex(ALGraph G,int v,int w)
{//返回第v结点相对于w邻接点的下一个结点
LinkList p;
p=G.vertices[v].firstarc;
while(p&&p->data.adjvex!=w)
p=p->nextarc;
if(p->data.adjvex==w&&p->nextarc)
return p->nextarc->data.adjvex;
else return -1;
}
void BFSTraverse(ALGraph G)
{//广度优先搜索
int i;
int v;
int w;
LinkQueue Q;
QElemType u;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
InitQueue(Q);//初始化链队列
printf("请输入起始点:");
scanf("%d",&v);
printf("广度优先搜索结果为:\n");
if(visited[v-1]==0){
visited[v-1]=1;
printf("%s ",G.vertices[v-1].data);
EnQueue(Q,v-1);
while(!QueueEmpty(Q)){
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)){
if(visited[w]==0){
visited[w]=1;
printf("%s ",G.vertices[w].data);
EnQueue(Q,w);
}
}
}
}
for(i=0;i<G.vexnum;i++){//当所建立的图不是连通图时,该步骤是用来遍历剩下的结点
if(visited[i]==0){
visited[i]=1;
printf("%s ",G.vertices[i].data);
EnQueue(Q,i);
while(!QueueEmpty(Q)){
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w)){
if(visited[w]==0){
visited[w]=1;
printf("%s ",G.vertices[w].data);
EnQueue(Q,w);
}
}
}
}
}
printf("\n");
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
[基本要求] 以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 [实现提示] 设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每条边为一个数对,可以对边的输入顺序做出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。
资源推荐
资源详情
资源评论










格式:x-rar 资源大小:192.8KB







格式:txt 资源大小:7.8KB 页数:11














收起资源包目录





























共 24 条
- 1
资源评论

- wuxinyou1232013-06-09还好 , 比较好点,作用很大
- tuxiantian2013-12-25这个还是有参考价值的!
- tianjingying2013-07-05没看明白,太难了!
- angel9211252013-08-14还不错~已经写在报告里交上去了~

yanghuanbei
- 粉丝: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 心电图基础-CV.pptx
- 三相微机继电保护测试仪(三相+单片机).doc
- 异辛醇储罐(1)池火事故模型预测截图.docx
- 管道清淤施工组织设计.pdf
- 地铁的环控技术.ppt
- 服装销量分析柱形图Excel模板.xlsx
- 邀请函格式--0.doc
- 公司薪酬设计方案(全面).doc
- 邢台市柏乡某造纸厂废水治理工程设计方案.doc
- 福建省2005装饰工程消耗量定额说明.docx
- 和君创业-员工素质模型研究.ppt
- [江苏]框架结构办公楼工程高支模专项施工方案.doc
- 用Proteus和Keil建立单片机仿真工程的步骤.doc
- 设备内检修安全作业证.doc
- 高三主题班会:+放飞理想+寻找人生坐标.ppt
- 砌筑施工技术交底(补充).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
