实验目的
- 掌握图的邻接矩阵和邻接表存储结构;
- 掌握图的深度优先遍历和广度优先遍历算法,复习栈和队列的应用;
- 掌握图的最小生成树、拓扑排序等应用及算法思想。
实验内容
以邻接矩阵或邻接表方式建立有向图,并分别利用深度优先遍历和广度优先遍历方法输出各结点元素。
下面代码是用邻接表建立的有向图
Source Code
#include<stdio.h>
#include<malloc.h>
#define MAXV 100 //顶点数目的最大值
int visited[MAXV]; //深度访问标记数组
int BFSvisited[MAXV]; //广度访问标记数组
typedef struct ANode
{
int adjNode; //该边的邻接点编号
ANode *next; //指向下一条边的指针
}ArcNode; //边结点类型
typedef struct Vnode
{
char data; //顶点信息
ArcNode *first; //指向第一个边结点
}VNode,AdjList[MAXV]; //头结点类型
typedef struct
{
AdjList vertices;
int n,e;//顶点数n和边数e
}ALGraph; //图邻接表类型
//创建有向图
void CreateGraph(ALGraph &g){
printf("请输入顶点数和边数:");
int n,e;
scanf("%d%d",&n,&e);
g.n=n;
g.e=e;
for(int i=0;i<g.n;i++){
g.vertices[i].data=i;
g.vertices[i].first=NULL;
}
printf("请输入每条边的两个顶点(用空格隔开)\n");
int x,y;
for(i=0;i<g.e;i++){
scanf("%d%d",&x,&y);
ArcNode *p =(ArcNode*)malloc(sizeof(ArcNode));
p->adjNode=y;
p->next=g.vertices[x].first;
g.vertices[x].first=p;
ArcNode *q=(ArcNode*)malloc(sizeof(ArcNode));
q->adjNode=x;
q->next=g.vertices[y].first;
g.vertices[y].first=q;
}
}
//深度优先遍历图,从第v个顶点开始遍历
void DFS(ALGraph g,int v)
{
visited[v]=true;
printf("%d ",g.vertices[v].data);
ArcNode *p=g.vertices[v].first;
int w;
while(p!=NULL){
w=p->adjNode;
if(!visited[w]){
DFS(g,w); //递归深度遍历
}
p=p->next;
}
}
//广度优先遍历借助队列,从v开始遍历
void BFS(ALGraph g,int v)
{
BFSvisited[v]=true;
ArcNode *p;
printf("%d ",g.vertices[v].data);
int que[MAXV];
int front=0,rear=0;
rear=(rear+1)%MAXV;
que[rear]= v;
int j;
while(rear!=front) //当队列不空的时候
{
front=(front+1)%MAXV;//出队
j =que[front];
p =g.vertices[j].first;
while(p!=NULL)
{
if(!BFSvisited[p->adjNode])
{
printf("%d ",g.vertices[p->adjNode].data);
BFSvisited[p->adjNode]=true;
rear=(rear+1)%MAXV;
que[rear]=p->adjNode;
}
p=p->next;//用的是邻接表,用p-next就可访问同层的相邻结点
}
}
}
int main()
{
ALGraph g;
CreateGraph(g);
printf("深度优先遍历顺序:\n");
DFS(g,0);
printf("\n");
printf("广度优先遍历顺序:\n");
BFS(g,0);
printf("\n");
}
Computational Results
Hint
此代码遍历过程是从初始点0开始遍历的,对应的图是