数据结构实验报告-图的遍历

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

数据结构实验报告
实验:图的遍历
一、实验目的:
1、理解并掌握图的逻辑结构和物理结构——邻接矩阵、邻接表
2、掌握图的构造方法
3、掌握图的邻接矩阵、邻接表存储方式下基本操作的实现算法
4、掌握图的深度优先遍历和广度优先原理
二、实验内容:
1、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接矩阵存储改图。

2、输入顶点数、边数、每个顶点的值以及每一条边的信息,构造一个无向图G,并用邻接表存储该图
3、深度优先遍历第一步中构造的图G,输出得到的节点序列
4、广度优先遍历第一部中构造的图G,输出得到的节点序列
三、实验要求:
1、无向图中的相关信息要从终端以正确的方式输入;
2、具体的输入和输出格式不限;
3、算法要具有较好的健壮性,对错误操作要做适当处理;
4、程序算法作简短的文字注释。

四、程序实现及结果:
1、邻接矩阵:
#include <stdio.h>
#include <malloc.h>
#define VERTEX_MAX 30
#define MAXSIZE 20
typedef struct
{
int
arcs[VERTEX_MAX][VERTEX_MAX] ;
int vexnum,arcnum;
} MGraph; void creat_MGraph1(MGraph *g) { int i,j,k;
int n,m;
printf("请输入顶点数和边数:");
scanf("%d%d",&n,&m);
g->vexnum=n;
g->arcnum=m;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
g->arcs[i][j]=0;
while(1)
{
printf("请输入一条边的两个顶点:\n");
scanf("%d%d",&i,&j);
if(i==-1 || j==-1)
break;
else if(i==j || i>=n || j>=n)
{
printf("输入错误,请重新输入!\n");
}
else
{
g->arcs[i][j]=1;
g->arcs[j][i]=1;
}
}
}
void printMG(MGraph *g) {
int i,j;
for (i=0;i<g->vexnum;i++)
{for (j=0;j<g->vexnum;j++)
printf(" %d",g->arcs[i][j]);
printf("\n");
}
printf("\n");
}
main()
{
int i,j;
int fg;
MGraph *g1;
g1=(MGraph
*)malloc(sizeof(MGraph));
printf("1:创建无向图的邻接矩阵\n\n");
creat_MGraph1(g1);
printf("\n此图的邻接矩阵为:\n"); printMG(g1);
}
2、邻接链表:
#include<stdio.h>
#include<malloc.h>
#define MAX_SIZE 10
typedef struct node{
int vertex;
struct node *next;
}node,adjlist[MAX_SIZE];
adjlist g;
int visited[MAX_SIZE+1];
int que[MAX_SIZE+1];
void creat()
{
int n,e;
int i;
int start,end;
node *p,*q,*pp,*qq;
printf("输入无向图的顶点数和边数:");
scanf("%d%d",&n,&e);
for(i = 1; i <= n ; i++)
{
visited[i] = 0;
g[i].vertex = i;
g[i].next = NULL;
}
printf("依次输入边:\n");
for(i = 1; i <= e ; i++)
{
scanf("%d%d",&start,&end);
p=(node *)malloc(sizeof(node));
p->vertex = end;
p->next = NULL;
q = &g[start];
while(q->next)
q = q->next;
q->next = p;
p1=(node
*)malloc(sizeof(node));
p1->vertex = start;
p1->next = NULL;
q1 = &g[end];
while(qq->next)
q1 = q1->next;
q1->next = p1;
}
}
void bfs(int vi)
{
int front,rear,v;
node *p;
front =0;
rear = 1;
visited[vi] = 1;
que[0] = vi;
printf("%d ",vi);
while(front != rear)
{
v = que[front];
p = g[v].next;
while(p)
{
if(!visited[p->vertex])
{
visited[p->vertex]= 1;
printf("%d
",p->vertex);
que[rear++] = p->vertex;
}
p = p->next;
}
front++;
}
}
int main()
{
creat();
bfs(1);
printf("\n");
return 0;
}
五.实验心得与体会:
(1)通过这次实验,使我基本上掌握了图的存储和遍历,让我弄清楚了如何用邻接矩阵和邻接链表对图进行存储
(2)深度优先遍历和广度优先遍历都有着各自的优点,通过程序逐步调试,可以慢慢的理解这两种遍历方法的内涵和巧妙之处。

(3)实验过程中,总体来说还算顺畅,但在编写过程中,要养成良好的编程习惯,以免出错后浪费大量的时间在查错上。

相关文档
最新文档