数据结构 图的遍历 C++实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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< p=p->next; } cout< } 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; } }