教育资源为主的文档平台

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

图的遍历

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

下载文档

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

网友最新关注

春之声
写作的开始
读《播撒诚信的种子》有感
摩崖石刻
鸟儿的自述
残疾人的精彩演出
雪之情
老师、警察和清洁工
外婆的“不解之缘”
难以忘怀的一幕
贝尔科普基地游
校园伴我成长
我的父亲
做个无规律一族
做实验
对我国会计师事务所合并浪潮的剖析
试论文学翻译中汉语模糊美的磨蚀与补偿
试论汉语言的民族性
银行存款余额在年度会计报表中列示的审计视角
浅谈分析汉语言文学专业推进产学合作教育的办法
试论汉语言文化对英语学习的负面影响及其对策
猴王作假与会计师过失
浅谈汉语言文化背景下习语译法的几点探索
浅谈汉语言文学专业双语教学
浅谈如何促进少数民族地区汉语言课程的改革
关于股份制改组审计若干问题的思考
增强法制观念
教育系统执行内部审计准则情况介绍
重要性概念在审计中的运用
独立审计准则:魔鬼抑或天使
希腊巴特农神殿简介
《蜡烛》教学设计
《蜡烛》个性化阅读教学案例
《蜡烛》教学设计──一切景语皆情语
《蜡烛》教学杂谈
《蜡烛》教学课例
圆明园全面恢复山形水系
《蜡烛》教学设计
《就英法联军远征中国给巴特勒上尉的信》有关资料
给学生以自信──西蒙诺夫《蜡烛》阅读教学片段分析
《蜡烛》教学设计
一代名园惨遭焚毁
《蜡烛》教学设计
《蜡烛》教学设计
《蜡烛》导语设计