教育资源为主的文档平台

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

图的遍历

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

下载文档

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

网友最新关注

Last Weekend
The litte green man
Baking a cake
My Teacher‘s House(我的老师的房子)
When I grow up
My Family
A Dream
A pair of socks
My House
Chinase New Year is coming soon
My father
Mr. Wang
写自己喜欢吃的食物
My friend
My Family Members
求职:如何应对无答案面试题?
专家教你简历和面试技巧
应聘者:你会侃薪水吗
外企面试有门道 你做好准备了吗?
招聘单位,邀你玩游戏!
就业面试应具备的心态
如何面试总经理女秘书?
面试时怎样不紧张
五大步帮你提高求职面试的成功率
求职面试必考题大公开
应聘时如何面对缺点
应聘绝招:重点突出你的优势!
外企面试考官最爱提的十个问题
如何巧避面试中四大陷阱
毕业生求职经验谈:早做准备最重要
计算机网络技术专业课程改革
缓冲区溢出攻击的分析及防范策略
ASP.Net中程序构架与程序代码的分离
利用VB实现对IE的调用与控制
2种茶饮料的研制及营养评价
无线接入技术及其发展特点
保障网络及网站系统安全的技术方法
浅析大学生网络成瘾的危害与对策
中药注射剂的合理应用
计算机网络安全的防范探索
计算机网络安全问题的原因
帕罗西汀治疗紧张性头痛46例分析
抗感冒药的不良反应
网络教学管理平台的建设探微
关于蒙药独特传统炮制技术简述
《人物描写一组》重点与难点提示
《景阳冈》美文欣赏二
《景阳冈》同步作文训练素材
《景阳冈》作家作品及写作背景
《景阳冈》同步作文范文欣赏
《景阳冈》重点问题探究
《草船借箭》美文欣赏一
《景阳冈》考点练兵 积累篇
《人物描写一组》重点字词梳理
《景阳冈》同步作文写作指导
《草船借箭》美文欣赏二
《景阳冈》美文欣赏一
《景阳冈》教案设计之二
《景阳冈》教案设计之一
《景阳冈》整体阅读感知