Graph.h (图的结构, 遍历, 常规操作接口)
/*定义图的最大定点数, 它要大于等于具体图的顶点树n*/
#define MaxVertexNum 12
/*定义图的最大边数,它要大于等于具体图的边数e*/
#define MaxEdgeNum 20
/* 定义MaxValue 为一个符号常量,其值要大于邻接矩阵中所有有效值之和*/
#define MaxValue 1000
/*定义MS为一个符号常量,用于广度优先搜索遍历的算法中,作为自定义顺序队列的数组长度*/
#define MS 20
/*定义图中顶点数据的类型VertexType为整型*/
typedef int VertextType;
/*定义vexlist为存储顶点信息的数组类型*/
typedef VertexType vexlist[MaxVertexNum];
/*定义adjmatrix 为存储邻接矩阵的数组类型*/
typedef int adjmatrix[MaxVertexNum][MaxVertexNum];
/*定义保存图顶点访问标记的数组*/
int visited[MaxVertexNum];
/*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
void Create1(vexlist GV, adjmatrix GA, int n, int e);
/*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
void dfs1(adjmatrix GA, int i, int n);
/*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
void bfs1(adjmatrix GA, int i, int n);
Graph.c (图的接口实现)
void Create1(vexlist GV, adjmatrix GA, int n, int e){
/*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
int i,j,k,w;
/*建立顶点数组*/
printf("输入%d个顶点数据\n", n);
for(i = 0; i<n; i++) scanf("%d", &GV[i]);
/*初始化邻接矩阵数组*/
for(i = 0; i<n; i++)
for(j = 0; j<n; j++){
if(i == j)GA[i][j] = 0;
else GA[i][j] = MaxValue;
}
/*建立邻接矩阵数组*/
printf("输入%d条无向带权边\n", e);
for(k = 1; k<=e; k++){
/*输入一条边的两端点序号i和j及边上的权w*/
scanf("%d %d %d", &i, &j, &w);
/*置数组中相应对称元素的值为w*/
GA[i][j] = GA[j][i] = w;
}
}
void dfs1(adjmatrix GA, int i, int n){
/*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
int j;
/*假定访问顶点Vi以输出该顶点的序号代之*/
printf("%d",i);
/*标记Vi已被访问过*/
visited[i] = 1;
/*依次搜索Vi的每个邻接点*/
for(j = 0; j<n; j++)
/*若Vi的一个有效邻接点Vj未被访问过,则从Vj出发进行递归调用*/
if(GA[i][j]!=0 && GA[i][j]!=MaxValue && !visited[j])
dfs1(GA, j, n);
}
void bfs1(adjmatrix GA, int i, int n){
/*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
/*定义一个顺序队列Q,其元素类型应为整形,初始化队列为空*/
int Q[MS]; //MS是一个事先定义的符号常量
int front = 0,rear = 0;
/*访问初始点Vi,同时标记初始点Vi已访问过*/
printf("%d" ,i);
visited[i] = 1;
/*将已访问过的初始点序号i入队*/
rear = (rear+1)%MS;
if(front == rear) {
printf("队列空间用完!\n");
exit(1);
}
Q[[rear] = i;
/*当队列非空时进行循环处理*/
while(front != rear){
int j,k;
/*删除队首元素,第一次执行时k的值为i*/
front = (front + 1)%MS;
k = Q[front];
/*依次搜索Vk的每一个可能的邻接点*/
for(j = 0; j<n; j++){
if(GA[k][j]!=0 && GA[k][j] != MaxValue&&!visited[j]){
printf("%d", j); //访问一个未被访问过的邻接节点Vj
visited[j] = 1; //标记Vj已被访问过
rear = (rear+1)%MS; //修改队尾指针
if(front == rear) {
printf("队列空间用完!\n");
exit(1);
}
Q[rear] = j;
}
}
}
}