广度优先遍历

#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值