无向图的存储及深度和广度优先遍历
《数据结构》实验报告
◎实验题目:无序图的存储并分别实现深度和广度优先遍历
◎实验目的:理解并掌握以邻接表的方式存储图,以及图的非递归的深度和广度优先遍历
◎实验内容:首先将图的元素输入并以邻接表的方式存储,然后分别进行递归和非递归遍历。
一、需求分析
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、运行界面。 五、 教师评语: 实验成绩: 指导教师签名: 批阅日期: 欢迎您的下载, 资料仅供参考! 致力为企业和个人提供合同协议,策划案计划书,学习资料等等 打造全网一站式需求