#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define INFINITY 10000
typedef struct graph{
char vexs[MAX];//顶点集合
int vexnum; // 顶点数
int arcnum; // 边数
int arc[MAX][MAX]; //邻接矩阵
int visited[MAX];//设置访问数组,未访问为0,已访问为1
}MGraph,*PGraph;
void create_graph(PGraph G){
int i,j,k,w;
printf("请输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
getchar();
for(i=0;i<G->vexnum;i++){
printf("请输入%d个顶点的信息\n",i+1);
scanf("%c",&G->vexs[i]);
getchar();
}
//邻接矩阵的初始化,对角线为0,其他地方为infinity
for(i=0;i<G->vexnum;i++){
for (j=0; j<G->vexnum; j++) {
if(i==j)
G->arc[i][j] = 0;
else
G->arc[i][j] = INFINITY;
}
//将所有的visited数组初始化为0
G->visited[i] = 0;
}
//对邻接矩阵进行赋值
for(k=0;k<G->arcnum;k++){
printf("输入边(vi,vj)的下标i,j以及权值w:");
scanf("%d%d%d",&i,&j,&w);
G->arc[i][j] = w;
G->arc[j][i] = w;
}
}
void DFS(PGraph G,int i){
//DFS主要还是使用栈访问就入栈
int base=0,top=0;
int stack[G->vexnum+1];//加1防止栈顶top越界
printf("%c ",G->vexs[i]);
G->visited[i] = 1;
stack[top++] = i;//访问过的顶点下标入栈
while(base!=top){
int m,j;//m取栈顶元素
m = stack[top-1];
for(j=0;j<G->vexnum;j++){
if((G->arc[m][j])!=INFINITY&&G->visited[j]!=1){
printf("%c ",G->vexs[j]);
stack[top++] = j;
G->visited[j] = 1;
break;
}
}
//m的相邻节点都访问结束则再弹出
if(j==G->vexnum){
top--;
}
}
}
void BFS(PGraph G,int i){
int queue[MAX];
int rear = 0,front = -1;
queue[rear] = i;
printf("%c ",G->vexs[i]);
G->visited[i] = 1;
while(rear!=front){
int m,j;//将要出队元素的下标赋值给m
m = queue[++front];
for(j=0;j<G->vexnum;j++){
if(G->arc[m][j]<INFINITY&&G->visited[j]!=1){
printf("%c ",G->vexs[j]);
G->visited[j] = 1;
queue[++rear] = j;
}
}
}
}
int main(){
int i;
i=0;
MGraph G;
create_graph(&G);
//DFS(&G,i);
BFS(&G,i);
}
无向图邻接矩阵广度遍历和深度遍历非递归算法(C语言)
最新推荐文章于 2021-12-02 23:43:11 发布