图的遍历操作
一、 实验目的:
该程序主要完成对图的创建,并实现图的深度优先遍历和广度优先遍历
二、 实验内容:
1、 所输入的数据要为整形数据
2、 输出的形式为:每按一次回车,遍历一个结点
3、 能创建最大结点树为30的任意图,实现对无向图的两种遍历
程序流程:
main()->clrscr()->visited()->DFS()->visited()->BFS().
代码:
#include<stdio.h>
#include<stdlib.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); /*输出点的信息*/
getchar();
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); /*输出正访问的点*/
getchar();
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); /*输出正访问的结点*/
getchar();
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*/
getchar(); /*等待输入*/
for(i=1; i<max_vex; i++)
visited[i]=0;
bfs(tu1,1); /*调用BFS*/
}
运行:
图: