教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> 图的遍历

图的遍历

上传者:网友
|
翻新时间: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;

下载文档

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

网友最新关注

展望我的未来
写一处风景名胜
空余时间的利用
残奥火炬传递大幕拉开(中英)
雷锋—我的英语老师
顾老年人的机器人
的家庭成员
绍一部电影
什么样的房子?
残奥会
学生是否应该做家务
识和信心是通向成功之路
残奥会英语作文
王楠的梦想
神舟七号
物价局规范教育收费的规章制度
公司对文明单位创建的管理规章制度
社区巡逻队员的岗位责任规章制度
小学推广普通话工作的相关规章制度
保洁工作的相关规章制度
信息化办公室的规章制度
铸轧车间工人民主考评的相关责任制度
局机关固定资产的相关规章制度
大学新生宿舍管理的相关规章制度
工厂工模部生产主管的工作责任制度
门卫值班的相关工作制度
小区业主委员会的规章制度样稿
农村公路的相关管理规章制度
发票问题上的管理规章制度
货物运输及站场管理的规章制度
关于管道预埋的一些质量关键点
水库供水环境安全问题研究
西气东输支干线工程水土保持监测
消防系统的运行可靠性估计
清末民初关中水利用水过程中的作弊行为研究
近代山陕地区基层水利管理体系探析
用换土垫层处理软弱土地基
推进广西水利信息化建设的思考和建议
典型洪水过程线放大修匀的简易方法
房地产项目水土保持方案
清末晋南乡村社会的水利管理与运行——以通利渠为例
渗水处理主要施工工艺流程及注意事项
我国洪水风险分析与区划的进展
生态移民的意义
论水利工程的机械安装与维护
《棉花姑娘》教学设计
《小壁虎借尾巴》教学设计
《匆匆》教学设计
《画风》教案设计
《荷叶圆圆》教学设计
《失物招领》
《棉花姑娘》教学设计
《詹天佑》教学设计
《夏夜多美》
《詹天佑》第二课时教学设计
《三个儿子》(第二课时)教案
《要下雨了》教学设计
《棉花姑娘》教学设计
《鲸》说课设计
《卖火柴的小女孩》的创新教案