#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct MatrixGraph)
#define VERTEX_MAX 26
#define MAXVALUE 32767
struct MatrixGraph
{
int Vertex[VERTEX_MAX]; //保存顶点信息(序号或字母)
int Edges[VERTEX_MAX][VERTEX_MAX]; //保存边的权
int isTrav[VERTEX_MAX]; //遍历标志
int VertexNum; //顶点数量
int EdgeNum; //边数量
int GraphType; //图的类型
};
struct Queue //用于广义搜索的队列的数据结构
{
int data; //数据项
int length; //队列长度
struct Queue *next;
};
void CreateMatrixGraph(MatrixGraph *G)
{
int i,j,k,weight;
int start,end;
printf("输入各顶点信息\n");
for(i=0;i<G->VertexNum;i++) //输入顶点
{
printf("\n第%d个顶点",i+1);
scanf("%d",&G->Vertex[i]);
}
printf("输入构成各边的两个顶点及权值\n");
for(k=0;k<G->EdgeNum;k++)
{
printf("第%d条边:",k+1);
scanf("%d,%d,%d",&start,&end,&weight);
for(i=0;start!=G->Vertex[i];i++); //输入边的信息
for(j=0;end!=G->Vertex[j];j++);
G->Edges[i][j]=weight;
if(G->GraphType==0) //若是无向图
{
G->Edges[j][i]=weight; //在对角位置保存权值
}
}
}
void OutMatrix(MatrixGraph *G)
{
int i,j;
for(j=0;j<G->VertexNum;j++)
{
printf("\t%d",G->Vertex[j]); //在第一行输出顶点信息
}
printf("\n");
for(i=0;i<G->VertexNum;i++)
{
printf("%d",G->Vertex[i]);
for(j=0;j<G->VertexNum;j++)
{
if(G->Edges[i][j]==MAXVALUE) //若权值为最大值
printf("\t#"); //输出#号
else
printf("\t%d",G->Edges[i][j]);
}
printf("\n");
}
}
BFSTraverse(MatrixGraph *G)
//邻接表的广度优先遍历
{
printf("广度遍历结果如下:\t");
for(int i = 1; i <= G -> VertexNum; i++) //清除各项顶点遍历标志
{
G -> isTrav[i] = 0;
}
struct Queue *head,*end,*p; //用于广度优先遍历的队列的头结点,尾节点,*p
head = end = (struct Queue*)malloc(LEN); //初始化队列
head -> data = G -> Vertex[0]; //第一个结点入队列
head -> length = 1;
end = head;
while(head->length > 0)
{
int Save_value_of_head = head -> data; //由于头结点首先出队列,但又需要将与头结点相连的结点入队列,所以先保存头节点值
printf("%d\t", head -> data);
G -> isTrav[head -> data] = 1; //标志位改变
if(head -> length > 1)
head = head -> next;
else{
head -> length --;
}
for(i = 0; i <= G -> VertexNum; i++)
{
if(G -> Edges[Save_value_of_head][i] != MAXVALUE && G -> isTrav[i] == 0) //寻找与之相连,且标志位为0的点入队列。
{
p = (struct Queue*)malloc(LEN);
p -> data = i;
p -> length = head -> length; //保存长度值
G -> isTrav[i] = 1; //标志位改变
if(head -> length == 0)
{
head = end = p;
head ->length++;
}
else{
end -> next = p;
end = p; //新节点连入队尾
head -> length++;
}
}
}
}
}
int main()
{
int i,j;
MatrixGraph G;
s:
printf("无向图(选1)还是有向图(选2)?");
scanf("%d",&G.GraphType);
if(G.GraphType != 1 && G.GraphType != 2){
printf("输入错误\n");
goto s;
}
printf("输入图的顶点数量和各边数量:");
scanf("%d,%d",&G.VertexNum,&G.EdgeNum); //输入图顶点数和边数
for(i=0;i<G.VertexNum;i++)
for(j=0;j<G.VertexNum;j++)
G.Edges[i][j]=MAXVALUE;
CreateMatrixGraph(&G);
printf("邻接矩阵数据如下:\n");
OutMatrix(&G);
BFSTraverse(&G);
}
广度优先遍历
最新推荐文章于 2024-09-04 07:00:00 发布