数据结构 图的遍历 C++实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

一、实验目的

1.掌握图的基本概念和邻接表的储存结构。

2.掌握图的邻接表存储结构的算法实现。

3.掌握图的邻接表存储结构上的遍历算法的实现。

二、实验内容

对给定的图,用邻接表实现该图的广义优先搜索遍历。

三、实验与算法分析

先定义图的邻接表数据类型,建立该图的邻接表,然后在用子函数写出广度优先搜索遍历的遍历算法,最后用主函数调用它。实现广度优先搜索遍历可以利用队列的原理。

用到两个类,一个用于定义链表类型,每个结点含有一个数据域和一个指针域。另一个类用于定义邻接表的表头类型并在其中实现建立邻接表,用邻接表从顶点i出发进行广度优先搜索遍历。2、队列:用于实现广度优先搜索遍历。

广度优先遍历的思想:广度优先遍历类似于树的按层次遍历。设图G的初态是所有顶点均未访问,在G中任选一顶点作为初始点,则广度优先搜索的基本思想是:(1)首先访问顶点i,并将其访问标志置为已被访问,即visited[i]=true;(2)接着依次访问与顶点i有边相连的所有顶点W1,W2,…….Wt;(3)然后再按顺序访问与W1,W2,…….Wt有边相连又未曾访问过的顶点;(4)依此类推,直到图中所有顶点都被访问完为止。

四、可执行程序及注释

#include

const int n=8; //表示图中的最大顶点数

const int e=15; //图中的最大边数

typedef int elemtype;

bool visited[n+1]; //标志数组用于记载某个顶点是否被访问过

class link //定义链表类型

{

public:

elemtype data;

link *next;

};

class GRAPH //定义邻接表的表头类型

{

public:

link a[n+1];

void creatlink() //建立图的邻接表

{

int i,j,k;

link *s;

for(i=1;i<=n;i++) //建立邻接表头结点

{

a[i].data=i;

a[i].next=NULL;

}

for(k=1;k<=e;k++)

{

cout<<"请输入一条边";

cin>>i>>j; //输入一条边(i,j)

cout<

s=new link; //申请一个动态存储单元

s->data=j;

s->next=a[i].next; //头插法建立链表

a[i].next=s; //头插法建立链表

s=new link;

s->data=i;

s->next=a[j].next; //头插法建立链表

a[j].next=s; //头插法建立链表

}

}

void dfs1(int i) //用邻接表从顶点i出发进行深度优先搜索遍历

{

link *p;

cout<

visited[i]=true; //全局数组访问标记置为1表示已访问

p=a[i].next;

while(p!=NULL)

{

if(!visited[p->data])

dfs1(p->data);

p=p->next;

}

}

void bfs1(int i) //用邻接表从顶点i出发进行广度优先搜索遍历

{

int q[n+1]; //定义队列

int f,r;

link *p;

f=r=0;

cout<

visited[i]=true;

r++;

q[r]=i; //进队

while(f

{

f++;

i=q[f]; //出队

p=a[i].next;

while(p!=NULL)

{

if(!visited[p->data])

{

cout<data].data<<" ";

visited[p->data]=true;

r++;

q[r]=p->data; //进队

}

p=p->next;

}

}

}

};

void main()

{

link *p;

int yn=1;

GRAPH G;

G.creatlink(); //建立邻接表

while(yn==1)

{

for(int i=1;i<=n;i++) //输出邻接表

{

p=G.a[i].next;

cout<";

while(p->next!=NULL)

{

cout<data<<"->";

p=p->next;

}

cout<data<

}

for(i=1;i<=n;i++)

visited[i]=false;

cout<<"请输入深度优先搜索开始访问的顶点";

cin>>i;

cout<

cout<<"从"<

G.dfs1(i);

cout<

for(i=1;i<=n;i++)

visited[i]=false;

cout<<"请输入广度优先搜索开始访问的顶点";

cin>>i;

cout<

cout<<"从"<

G.bfs1(i);

cout<

cout<<"继续遍历吗(1/2)?";

cin>>yn;

}

}

相关文档
最新文档