图的遍历主要有两种方式:深度优先遍历(Depth_First_Search)深度优先遍历和广度优先遍历(Breadth_First_Search)。图的深度优先遍历类似于树的先序遍历,图的广度优先遍历类似于树的层次遍历。
这里用图的深度优先遍历实现图的遍历(基于无向无权图的邻接表存储结构)
#pragma once
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#define Max_size 10
#define T char
typedef struct Edges
{
int dex;//顶点的下标
struct Edges *link;//指向下一条边的指针
}Edges;
typedef struct Vertex
{
T data;//顶点数据
Edges *adj;//顶点指向边的指针
}Vertex;
typedef struct Graph_table
{
int MaxVertices;//最大容量
int NmuVertices; //顶点数
int NumEdges; //边数
Vertex *NnodeTable;//顶点的结构的表,
}Graph_table;
void InitGraph(Graph_table *gt)
{
gt->MaxVertices = Max_size;
gt->NmuVertices = gt->NumEdges = 0;
gt->NnodeTable = (Vertex*)malloc(sizeof(Vertex)*(gt->MaxVertices));
assert(NULL != gt->NnodeTable);
for(int i= 0;i<gt->MaxVertices;++i)
{
gt->NnodeTable[i].adj = NULL;
}
}
void InsertVertex(Graph_table *gt,T x)//
{
if(gt->NmuVertices >= gt->MaxVertices)
return;
gt->NnodeTable[gt->NmuVertices++].data = x;
}
void Show(Graph_table *gt)
{
Edges *p;
for(int i=0;i<gt->NmuVertices;++i)
{
printf("%d , %c : ",i,gt->NnodeTable[i].data);
p = gt->NnodeTable[i].adj;
while(NULL != p)
{
printf("%d --> ",p->dex);
p = p->link;
}
printf("NULL.\n");
}
printf("\n");
}
int Getpos(Graph_table *gt,T x) //获取顶点的位置
{
for(int i= 0;i<gt->NmuVertices;++i)
{
if(gt->NnodeTable[i].data == x)
return i;
}
return -1; //顶点在表里不存在
}
void InsertEdge(Graph_table *gt,T x,T y) //插入边
{
int p1 = Getpos(gt,x);
int p2 = Getpos(gt,y);
if(p1==-1 || p2==-1)
return;
Edges *s;
s = (Edges *)malloc(sizeof(Edges));//开辟边结点
assert(s != NULL);
s->dex = p2; //x-->y x到y的边
s->link = gt->NnodeTable[p1].adj;
gt->NnodeTable[p1].adj = s;
s = (Edges *)malloc(sizeof(Edges));//开辟边结点
assert(s != NULL);
s->dex = p1; //y-->x y到 x的边
s->link = gt->NnodeTable[p2].adj;
gt->NnodeTable[p2].adj = s;
gt->NumEdges++;
}
typedef int Boolean;
Boolean visited[Max_size];
void DFS(Graph_table *gt,int i) //邻接表的深度优先递归算法
{
Edges *p;
visited[i] = true;
printf("%c ",gt->NnodeTable[i].data);
p = gt->NnodeTable[i].adj;
while(p)
{
if(!visited[p->dex])
DFS(gt,p->dex);
p = p->link;
}
}
void DFSvisit(Graph_table *gt) //邻接表的深度遍历
{
int i;
for(i=0;i<gt->NmuVertices;++i)
{
visited[i] = false;
}
for(i=0;i<gt->NmuVertices;++i)
{
if(!visited[i])
DFS(gt,i);
}
}
测试文件
#include"Graph_DFS.h"
void main()
{
Graph_table gt; //邻接表的对象
InitGraph(>); //邻接表的初始化
InsertVertex(>,'A');//图的顶点的插入
InsertVertex(>,'B');
InsertVertex(>,'C');
InsertVertex(>,'D');
InsertVertex(>,'E');
Show(>);
InsertEdge(>,'A','B');//图的边的插入
InsertEdge(>,'A','D');
InsertEdge(>,'B','C');
InsertEdge(>,'B','E');
InsertEdge(>,'C','D');
InsertEdge(>,'C','E');
Show(>);
DFSvisit(>);//图的深度优先遍历
}