数据结构实验四:图的应用

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

数据结构实验报告

20 10 ~20 11 学年第一学期2008级计算机专业

班级:学号:姓名:

实验四图的应用

一、实验目的:

1.掌握图的存储结构及其构造方法

2.掌握图的两种遍历算法及其执行过程

二、实验内容:

以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。

提示:首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先和广度优先遍历,并输出遍历的结果。

三、实验要求:

1.各班学号为单号的同学采用邻接矩阵实现,学号为双号的同学采用邻接表实现。

2.C/ C++完成算法设计和程序设计并上机调试通过。

3.撰写实验报告,提供实验结果和数据。

4.写出算法设计小结和心得。

四、程序源代码:

#include

typedef char vextype;

const MAXVER=21;

typedef struct listnode {

int adjvex;

listnode* next;

}listnode;//表结点

typedef struct

{

vextype data;

listnode *first;

}headnode;//头结点typedef struct

{

headnode vexs[MAXVER];

int vexnum,arcnum;

} ALgraph;//图

void createALgraph(ALgraph &G)

{

int i, s, d;

listnode *p,*q;

cout<<"输入图的顶点数和边数:"; cin>>G.vexnum>>G.arcnum;

for(i=1;i<=G.vexnum;i++)

{

cout<<"\n输入第"<>G.vexs[i].data;

G.vexs[i].first=NULL;

} //输入第i个结点值并初始化第i个单链表为空

for(i=1; i<=G.arcnum; i++)

{

cout<<"\n输入第"<

cin>>s>>d;//s为始点,d为终点

p=new listnode;

p->adjvex=d;

p->next=G.vexs[s].first;

G.vexs[s].first=p;

//将新建的以d为信息的表结点p插入s 单链表的头结点后

q=new listnode;

q->adjvex=s;

q->next=G.vexs[d].first;

G.vexs[d].first=q;

//将新建的以s为信息的表结点q插入d 单链表的头结点后

}

}

int visited[MAXVER];//定义全局数组遍历visited

void dfs(ALgraph G, int v)//被遍历的图

G采用邻接表作为存储结构,v为出发顶点编号

{

listnode *p;

cout<

visited[v]=1;

p=G.vexs[v].first;

while(p!=NULL)

{

if(visited[p->adjvex]==0)

dfs(G,p->adjvex);

//若p所指表结点对应的邻接顶点未访问则递归地从该顶点出发调用dfs

p=p->next;

}

}

void dfsTraverse(ALgraph G)

{

int v;

//遍历图之前初始化各未访问的顶点

for(v=1; v<=G.vexnum; v++)

visited[v]=0;

//从各个未被访问过的顶点开始进行深度遍历

for(v=1;v<=G.vexnum;v++)

if(visited[v]==0) dfs(G,v);

}

void BFS(ALgraph G, int v)

//从顶点编号v出发,广度遍历邻接表存储的图G

{

int queue[MAXVER], front ,rear;

listnode* p;

front=rear=0;

cout<

visited[v]=1;

queue[++rear]=v;

while(front!=rear)

{

v=queue[++front];

p=G.vexs[v].first;

while(p!=NULL)

{

if(visited[p->adjvex]==0)

{

v=p->adjvex;

cout<

visited[v]=1;

queue[++rear]=v;

}

p=p->next;

}

} }

void BFSTraverse(ALgraph G)

{

int v;

//遍历G以前,初始化visited数组为0 for(v=1;v<=G.vexnum;v++)

visited[v]=0;

for(v=1;v<=G.vexnum;v++)

if(visited[v]==0)

BFS(G,v);

}

void main()

{

ALgraph g;

createALgraph(g);

cout<

dfsTraverse(g);

cout<

BFSTraverse(g);

cout<

}

五、程序运行情况(写出输入数据及运行结果)

相关文档
最新文档