一、 实验目的:
该程序主要完成对图的创建,并实现图的深度优先遍历和广度优先遍历
二、 实验内容:
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*/ }
图: