翻新时间:2013-12-18
图的遍历
1.需求分析
【实验目的】
很多涉及图上操作的算法都是以图的遍历操作为基础的,通过这个实验的算法设计,可以巩固所学的有关图的基本知识。
【基本要求】
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列。
2.算法设计
1)为了实现上述程序功能,需要定义单链表的抽象数据类型:
定义边结点 ArcNode
数据成员 int adjvex;
struct ArcNode *nextarc;
定义顶点信息 VNode
数据成员 VertexType data;
ArcNode *firstarc;
定义无向图 typedef struct
数据成员 AdjList vertices;
int vexnum,arcnum;
定义链表 typedef struct LNode
数据成员 ElemType data;
struct LNode *next;
定义头结点 typedef struct QNode
数据成员 QElemType data;
struct QNode *next;
定义队列 typedef struct
数据成员 QueuePtr front;
QueuePtr rear;
2)本程序用到的主要函数:
InitQueue(LinkQueue &Q) //初始化队
EnQueue(LinkQueue &Q,QElemType e) //入队
DeQueue(LinkQueue &Q,QElemType &e) //出队
LocateVex(ALGraph G,char v) //确定v在G中的位置
CreateDG(ALGraph &G) //创建无向连通图的邻接表结构
FirstAdjvex(ALGraph G,int v) //返回G中顶点v的第一个邻接点
NextAdjVex(ALGraph G,int v,int w) //返回G中顶点v相对于w的下一个邻接点
BFSTraverse(ALGraph G) //进行深度优先遍历
DFS(ALGraph G,int v,int *visited)
DFSTraverse(ALGraph G) //进行广度优先遍历3.调试分析
刚开始输入的是abcdef可是遍历出来的是123456的数字,后来将入前的出输改写成G.vertices[w].data形式就可以了。
4.经验收获和体会
每次都要写这个,我都不知写什么好了呵呵,嗯总体来说还是那句话程序要自已编出来的才叫好。无论编得怎么样总会学到东西的,编写的同时也可以复习以前的知识这样很好。
5.测试数据及结果
6.附录
#include"iostream.h"
#include"stdlib.h"
typedef char VertexType;
typedef int QElemType;
typedef int ElemType;
typedef int Status;
#define MAX 20
#define ok 1
bool visit[MAX];
typedef struct ArcNode //定义边结点
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode //定义顶点信息
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX];
typedef struct //定义无向图
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct LNode //定义链表
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
typedef struct QNode //定义头结点
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct //定义队列
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue &Q) //初始化队
{
Q.front=new QNode;
if(!Q.front)exit(-
1);
Q.front->next=NULL;
Q.rear=Q.front;
return ok;
}
Status EnQueue(LinkQueue &Q,QElemType e) //入队
{
QueuePtr p;
p=new QNode;
if(!p)exit(-
1);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return ok;
}
Status DeQueue(LinkQueue &Q,QElemType &e) //出队
{
if(Q.front==Q.rear)return false;
QueuePtr p;
p=Q.front->next;
Q.front->next=p->next;
e=p->data;
if(Q.rear==p)Q.rear=Q.front;
delete p;
return ok;
}
int LocateVex(ALGraph G,char v) //确定v在G中的位置
{
for(int i=0;i<G.vexnum;i++)
if(G.vertices[i].data==v)
return i;
if(i==G.vexnum)
{
cout<<"你的输入有错请重新输入"<<endl;
return -1;
}
return 0;
}
void CreateDG(ALGraph &G) //创建无向连通图的邻接表结构
{
cout<<"请输入图的结点数:"<<endl;
cin>>G.vexnum;
cout<<"请输入图的边数:"<<endl;
cin>>G.arcnum;
for(int i=0;i<G.vexnum;i++) //构造表头向量
{
cout<<"请输入第"<<i+1<<"个结点的信息"<<endl;
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL; //初始化头结点
} for(int k=0;k<G.arcnum;k++) //输入各边并构造邻接表
{
cout<<"请输入第"<<k+1<<"条边所对应的的两个结点"<<endl;
e: int s=LocateVex(G,v
1); //确定v1在G中的位置
int t=LocateVex(G,v
2); //确定v2在G中的位置
if(s<0||t<0)
goto e;
ArcNode *p=new ArcNode;
p->adjvex=t;
ArcNode *q=G.vertices[s].firstarc; //采用头插法插入链表
G.vertices[s].firstarc=p;
p->nextarc=q; //因为是无向图,每条边对应两个结点
s=LocateVex(G,v
2);
t=LocateVex(G,v
1);
p=new ArcNode;
p->adjvex=t;
q=G.vertices[s].firstarc;
G.vertices[s].firstarc=p;
p->nextarc=q;
}
}
void BFSTraverse(ALGraph G) //进行广度优先遍历
{
int v,w,u;
int visited[MAX];
LinkQueue Q;
for(v=0;v<G.vexnum;++v)
visited[v]=0;
InitQueue(Q);
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
{
visited[v]=1;
cout<<G.vertices[v].data<<" ";
EnQueue(Q,v);
while(!(Q.rear==Q.front))
{
DeQueue(Q,u);
for(w=G.vertices[u].data;
G.vertices[u].firstarc!=NULL;
w=G.vertices[u].firstarc->adjvex,
G.vertices[u].firstarc=G.vertices[u].firstarc->nextarc)
if(visited[w]==0)
{
visited[w]=1;
cout<<G.vertices[w].data<<" ";
EnQueue(Q,w);
}
}
}
}
void DFS(ALGraph G,int v,int *visited)
{
int w;
visited[v]=1;
cout<<G.vertices[v].data<<" ";
for(w=G.vertices[v].data;
G.vertices[v].firstarc!=NULL;
w=G.vertices[v].firstarc->adjvex,
G.vertices[v].firstarc=G.vertices[v].firstarc->nextarc)
if(visited[w]==0)
DFS(G,w,visited);
}
void DFSTraverse(ALGraph G) //进行深度优先遍历
{
int v;
int visited[MAX];
for(v=0;v<G.vexnum;++v)
visited[v]=0;
for(v=0;v<G.vexnum;++v)
if(visited[v]==0)
DFS(G,v,visited);
}
int main()//主函数
{
ALGraph G;
CreateDG(G);
cout<<"深度优先遍历序列:";
DFSTraverse(G);
cout<<endl;
cout<<"广度优先遍历序列:";
BFSTraverse(G);
cout<<endl;
return 0;
下载文档
网友最新关注
- 我最想做的事
- 英语练习
- 我爱国旗
- 秋天的乐趣
- 我希望我的房间是……
- 最伤心的一件事
- 春天的颜色
- 我把幸福告诉你
- 西瓜
- 爱是什么
- 秋天的发现
- 续写一只小鸟
- 美丽的秋天
- 读《家用小太阳》有感
- “球迷”爸爸
- 2012年预备党员入党转正申请书范文
- 2012年1月最新入党转正申请书范文
- 2012年银行职员入党转正申请书
- 各行业通用的入党转正申请书
- 1月大学生入党转正申请书范文
- 2012年民警入党转正申请书
- 2012年高中教师入党转正申请书
- 2012年1月入党转正申请书范文
- 2012年3月入党转正申请书
- 2012年小学教师入党转正申请书
- 最新大学生入党转正申请书
- 2010军队士官入党转正申请书
- 2012年预备党员转正申请书
- 最新的工人入党转正申请书范文
- 2012年6月护士入党转正申请书范文
- 关于供电设备状态检修有关问题的探讨
- 初探建筑电气工程管理
- 霸权的兴衰及其理论启示
- 试论铁路如何扩大市场份额
- 论政府的开放性
- 公路计重收费系统施工监理方法及要点
- 电气制图与AutoCAD融合式教学的探讨
- 公民社会理念的由来及现实意义的思考
- 我国铁路交通运输行业发展战略研究
- 关于尽快制定适应长大货物车过桥活载新标准的建议
- 公路绿化的新方法
- 试论设计阶段的造价控制
- 探析贵州山区公路改造边沟优化设计
- 汽车电气配线高级电气工程师的训练
- 正负电子对撞机重大改造工程超导腔恒温器静态热负荷分析
- 《农业的变化真大》词语
- 《黄山奇石》教学设计之三
- 《黄山奇石》片断赏析
- 《农业的变化真大》教学设计片断
- 《日月潭》教学设计之二
- 《活化石》教学设计1
- 《数星星的孩子》教学设计(北师大版小学语文教案)
- 《日月潭》教学设计之三
- 《日月潭》教学构想
- 《北京亮起来了》教学设计之一
- 《日月潭》教学设计之一
- 《数星星的孩子》教学实录(北师大版小学语文第二册教案)
- 《黄山奇石》教学设计之一
- 《黄山奇石》教学设计之二
- 《黄山奇石》综合资料