无向图的存储及深度和广度优先遍历

无向图的存储及深度和广度优先遍历
无向图的存储及深度和广度优先遍历

《数据结构》实验报告

◎实验题目:无序图的存储并分别实现深度和广度优先遍历

◎实验目的:理解并掌握以邻接表的方式存储图,以及图的非递归的深度和广度优先遍历

◎实验内容:首先将图的元素输入并以邻接表的方式存储,然后分别进行递归和非递归遍历。

一、需求分析

1、输入的形式和输入值的范围:

①输入图的顶点元素和边;

②输入数字选择要进行的操作:深度遍历,广度遍历或结束操作。

2、输出的形式:

按深度或者广度优先顺序输出各节点的编号

3、程序所能达到的功能:

(1)以邻接表的方式存储图

(2)对图进行深度优先的非递归遍历

(3)对图进行广度优先的非递归遍历

4、测试数据:

输入各结点元素:a,b,c,d,e,f,g,h;

输入图中的各边:1,2 1,3 2,4 2,5 3,6 3,7 4,8 5,8

操作选项输入1进行深度优先遍历;

遍历结果为:1 3 7 6 2 5 8 4

操作选项输入2进行广度优先遍历;

遍历结果为:1 3 2 7 6 5 4

二概要设计

(1)抽象数据类型定义:

#define MaxVerNum 100

//边表结点

typedef struct node{

int adjvex;

struct node *next;

}EdgeNode,*ENode;

顶点表结点;

typedef struct vnode{

char vertex;

EdgeNode *firstedge;

}VertexNode;

typedef VertexNode AdjList[MaxVerNum];

定义图;

typedef struct{

AdjList adjlist;

int n,e;

}AlGraph;

AlGraph G;

(2)主程序的流程:

1.根据提示输入顶点个数和边的个数;

2.输入图的各边;

3. 输入数字执行相关操作

(3)其函数之间调用关系如下:

执行结束后,重新执行判定操作和循环。

三详细设计

1.元素类型

#define MaxVerNum 100

typedef struct node{

int adjvex;

struct node *next;

}EdgeNode,*ENode;

typedef struct vnode{

char vertex;

EdgeNode *firstedge;

}VertexNode;

typedef VertexNode AdjList[MaxVerNum];

typedef struct{

AdjList adjlist;

int n,e;

}AlGraph;

AlGraph G;

2.每个模块的分析:

(1)主程序模块:

int main()

{

int a,v;

//创建图

Create(G);

printf("请选择要进行的操作:\n 选择深度优先请输入1;\n 选择广度优先请输入2;\n结束操作请输入0\n");

scanf("%d",&a);

while(a!=0)

{

printf("请输入开始遍历顶点的坐标\n");

scanf("%d",&v);

if(a==1)

//深度优先遍历

DfsTravel(G,v);

}

else if(a==2)

//广度优先遍历

{ BfsTravel(G,v);

}

printf("请选择要进行的操作:\n 选择深度优先请输入1;\n 选择广度优先请输入2;\n结束操作请输入0\n");

scanf("%d",&a);

}

return 0;

}

(2)深度优先遍历

void DfsTravel(AlGraph &G,int v)

{

ENode stack[MaxVerNum];

ENode p;

int visited[MaxVerNum],top=-1,i;

for(i=0;i

visited[i]=0;

printf("深度优先遍历的结果为:\n");

printf("%d ",v);

visited[v]=1;

p=G.adjlist[v].firstedge;

while(top!=-1||p!=NULL)

{

while(p!=NULL)

{

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

p=p->next;

else

{

printf("%d ",p->adjvex);

visited[p->adjvex]=1;

top++;

stack[top]=p;

p=G.adjlist[p->adjvex].firstedge;

}

}

if(top!=-1)

{ p=stack[top];

top--;

p=p->next;

}

}

printf("\n");

}

(3)广度优先遍历

void BfsTravel(AlGraph &G,int v)

{

int visited[MaxVerNum];

int queue[MaxVerNum];

int front=-1,rear=-1;

EdgeNode *p;

int i;

for(i=0;i

visited[i]=0;

printf("广度优先遍历的结果为:\n");

printf("%d ",v);

visited[v]=1;

rear=rear+1;

queue[rear]=v;

while(front!=rear)

{

front++;

v=queue[front];

p=G.adjlist[v].firstedge;

while(p!=NULL)

{

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

{

printf("%d ",p->adjvex); visited[p->adjvex]=1;

rear=rear+1;

queue[rear]=p->adjvex;

}

p=p->next;

}

}

printf("\n");

}

(4)创建图

void Create(AlGraph &G)

{

int i,j,k;

EdgeNode *s,*r;

printf("请依次输入无向图顶点个数和边的个数\n");

scanf("%d,%d",&(G.n),&(G.e));

getchar();

printf("请输入各顶点信息\n");

for(i=0;i

{

scanf("%c",&(G.adjlist[i].vertex));

getchar();

G.adjlist[i].firstedge=NULL;

}

printf("请输入各边的信息,输入格式为i,j\n");

for(k=0;k

{

scanf("%d,%d",&i,&j);

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=j;

s->next= G.adjlist[i].firstedge;

G.adjlist[i].firstedge=s;

r=(EdgeNode*)malloc(sizeof(EdgeNode));

r->adjvex=i;

r->next= G.adjlist[j].firstedge;

G.adjlist[j].firstedge=r;

}

}

四使用说明、测试分析及结果

输入各结点元素:a,b,c,d,e,f,g,h;

输入图中的各边:1,2 1,3 2,4 2,5 3,6 3,7 4,8 5,8

操作选项输入1进行深度优先遍历;

遍历结果为:1 3 7 6 2 5 8 4

操作选项输入2进行广度优先遍历;

遍历结果为:1 3 2 7 6 5 4

1.程序使用说明;

(1)本程序的运行环境为VC6.0。

(2)进入演示程序后即显示提示信息:

请输入顶点个数和边的个数:

2、测试结果与分析;

输入各结点元素:a,b,c,d,e,f,g,h;

输入图中的各边:1,2 1,3 2,4 2,5 3,6 3,7 4,8 5,8

操作选项输入1进行深度优先遍历;

遍历结果为:1 3 7 6 2 5 8 4

操作选项输入2进行广度优先遍历;

遍历结果为:1 3 2 7 6 5 4

3、运行界面。

五、

教师评语:

实验成绩:

指导教师签名:

批阅日期:

欢迎您的下载,

资料仅供参考!

致力为企业和个人提供合同协议,策划案计划书,学习资料等等

打造全网一站式需求

相关主题
相关文档
最新文档