★观前提示:本篇内容为数据结构实验,代码内容经测试没有问题,但是可能会不符合每个人实验的要求,因此以下内容建议仅做思路参考。
一、实验目的
(1)理解并熟悉掌握图的邻接矩阵和邻接表的存储表示方法;
(2)熟悉掌握图的深度和广度优先的遍历算法。
二、实验要求
(1)所输入的数据要为整型数据。
(2)输出的形式为:每按一次回车,遍历一个结点。
(3)能创建最大结点数为30的任意图,实现对无向图的两种遍历。
(4) 程序流程: main()clrscr()visited()→DFS()visited()→BFS()。
★温馨提示:以下代码均为改正过的代码,皆已经过测试。
三、源码实现
#include<stdio.h>
#include<stdlib.h> //头文件
#include<conio.h>
#include<string.h>
#define max_vex 30 /*定义MAXVEX=30*/
struct edge_node /*定义边的结构体*/
{
int adjvex;
char info;
struct edge_node*next;
};
struct vex_node /*定义点的结构体*/
{
char data;
struct edge_node*link;
};
typedef struct vex_node adjlist[max_vex]; /*自定义adjlist为结构体数组类型*/
adjlist tu1; /*定义结构体数组变量tu1*/
void creategraph(adjlist g,int n) /*图创建函数*/
{
int e,i,s,d; /*定义存储边、点的变量*/
struct edge_node*p,*q; /*定义边的结构体指针*/
printf("the point(n) and edge(e):"); /*显示提示输入点,边*/
scanf("%d,%d",&n,&e); /*接收点、边存入n,e中*/
for(i=1; i<=n; i++)
{
getchar();
printf("\tthe %d information:",i); /*提示输入结点信息*/
scanf("%c",&g[i].data); /*存储信息*/
g[i].link=NULL; /*最后指针为空*/
}
for(i=1; i<=e; i++)
{
printf("\nthe%d edges=>\n\t :",i); /*提示输入边信息*/
scanf("%d,%d",&s,&d); /*接收边的信息*/
p=(struct edge_node*)malloc(sizeof(struct edge_node));
q=(struct edge_node*)malloc(sizeof(struct edge_node)); /*开辟两个存储边的空间*/
p->adjvex=d; /*把其中一个点存储下来*/
p->info=g[d].data;
q->adjvex=s; /*把另一个点存储下来*/
q->info=g[s].data;
p->next=g[s].link; /*p和s的link指针连接起来*/
g[s].link=p;
q->next=g[d].link; /*q和s的link指针连接起来*/
g[d].link=q; /*完成一个边的创建*/
}
}
int visited[max_vex]; /*定义访问数组*/
void dfs(adjlist adj,int v) /*深度优先遍历函数*/
{
int i;
struct edge_node*p; /*定义边指针*/
visited[v]=1; /*把开始遍历的点在访问数组中标识*/
printf("now is at point %d",v); /*输出正访问的点*/
p=adj[v].link;
printf("the data is %c \n",adj[v].data); /*输出点的信息*/
getch();
while(p)
{
if(visited[p->adjvex]==0)
dfs(adj,p->adjvex); /*没有访问的再调用DFS函数*/
p=p->next; /*访问过的判断下一个*/
}
}
int quene[max_vex];
void bfs(adjlist adj,int vi) /*广度优先遍历函数*/
{
int m=max_vex; /*定义一个队列*/
int front=0,rear=1,v;
struct edge_node*p; /*定义边指针*/
visited[vi]=1; /*开始访问的点标识一下*/
printf("now visit the point:%d\n",vi); /*输出正访问的点*/
getch();
quene[rear]=vi; /*把访问过的点放入数组中*/
while(front!=rear)
{
front=(front+1)%m;
v=quene[front];
p=adj[v].link;
while(p)
{
if(visited[p->adjvex]==0) /*判断p->adjvex点是否访问过*/
{
visited[p->adjvex]=1; /*访问没有访问过的结点*/
printf("now visit the point:%d\n",p->adjvex); /*输出正访问的结点*/
getch();
rear=(rear+1)%m;
quene[rear]=p->adjvex; /*放入数组中*/
}
p=p->next; /*指向下一个*/
}
}
}
int main()
{
int i;
system("CLS");
creategraph(tu1,0); /*创建图*/
for(i=1; i<max_vex; i++)
visited[i]=0; /*访问数组初始化*/
dfs(tu1,1); /*调用DFS*/
getch(); /*等待输入*/
for(i=1; i<max_vex; i++)
visited[i]=0;
bfs(tu1,1); /*调用BFS*/
}
四、实验总结
① 通过本次实验,理解了图的相关算法,掌握了图的邻接矩阵和邻接表的存储表示方法,对图有了进一步的认识和了解。
② 通过多次尝试对图的代码实现,理解了图如何创建生成及其实现原理。
③ 明白了图的代码实现逻辑,掌握了图的两种遍历算法如:深度优先遍历和广度优先遍历。
2022.5.21记录:Code_流苏(CSDN)
如有任何疑问,评论回复,看到即回,欢迎大家多多交流学习!
★以上实验内容仅供参考。