数据结构实验报告
实验:图的遍历
一、实验目的:
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)实验过程中,总体来说还算顺畅,但在编写过程中,要养成良好的编程习惯,以免出错后浪费大量的时间在查错上。
数据结构实验报告计科101冯康20xx00814128实验五图的基本操作一实验目的1使学生可以巩固所学的有关图的基本知识2熟练掌握…
数据结构验报告实验图的遍历一实验目的1理解并掌握图的逻辑结构和物理结构邻接矩阵邻接表2掌握图的构造方法3掌握图的邻接矩阵邻接表存储…
电子信息工程学系实验报告适用于计算机课程课程名称数据结构实验项目名称图的遍历操作实验时间班级计应102姓名学号实验目的掌握有向图和…
实验五图的存储与遍历1实验目的掌握图这种复杂的非线性结构的邻接矩阵和邻接表的存储表示以及在此两种常用存储方式下深度优先遍历dfs和…
实验五图的遍历及其应用实现一、实验目的1.熟悉图常用的存储结构。2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。…
心得体会:做了一个星期的程序设计终于做完了,在这次程序设计课中,真是让我获益匪浅。对大一学习的C语言和这学期开的数据结构,并没有掌…
课程设计的心得体会刚一开始抽到题目,我一看觉得无从下手,由于那个时候很多课都还在进行着,也就是抽空思考一下思路,也到图书馆中借了相…
数据结构课程设计心得体会学号:0804012023班级:计本(2)班姓名:谷敏敏经过两个星期的不懈努力,数据结构课程设计终于落幕。…
课程设计心得体会姓名:曾辉学号;0804012041班级:08计本(2)课程设计是计算机科学与技术专业学生的集中实践性环节之一,是…
课程设计的心得体会姓名:何云龙学号:0804012022班级:08计科(2)班“数据结构与算法课程设计”是计算机科学与技术专业学生…
二叉树的遍历实验报告一需求分析在二叉树的应用中常常要求在树中查找具有某种特征的结点或者对树中全部结点逐一进行某种处理这就是二叉树的…