[数据结构]C语言实现,邻接矩阵实现图的广度优先遍历

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

#define VERTEX_MAX 128/*最大顶点数*/
#define MAXVALUE 1024

typedef enum { False, True } boolean;
boolean visited[VERTEX_MAX];

typedef struct SeqQueue{
	int data[VERTEX_MAX];
	int front, rear;
}*PSeqQueue;

typedef struct {
	char Vertexs[VERTEX_MAX];//顶点表 保存顶点信息
	int arcs[VERTEX_MAX][VERTEX_MAX];
	int VertexNum, EdgeNum;//顶点数和边数
	bool GraphType;//图的类型 0为无向图,1为有向图
}MGraph;

PSeqQueue Init_SeqQueue();
int Empty_SeqQueue(PSeqQueue Q);
int In_SeqQueue(PSeqQueue Q, int x);
int Out_SeqQueue(PSeqQueue Q, int * x);
void Destroy_SeqQueue(PSeqQueue *Q);
void CreateGraph(MGraph *G);
void  BFStraverse(MGraph G);
void  BFS(MGraph  G, int  v);
void Visit(MGraph *G,int v);

int main()
{
	int v=0;
	MGraph G;
	CreateGraph(&G);
	BFStraverse(G);
	BFS(G, v);
	system("pause");
	return 0;

}

/***********************************************FUNCTION*********************************************/
void CreateGraph(MGraph *G)
{
	int i, j, k,l,count, weight;//weight为权值
	char start, end;//边的起始定点
	printf("请选择要要遍历的图的类型:1、有向图;2、无向图\n");
	scanf("%d", &(G->GraphType));

	printf("请输入顶点数和边数:\n");
	scanf("%d %d", &(G->VertexNum), &(G->EdgeNum));
	

	for ( l = 0; l < G->VertexNum; l++)
	{
		printf("请输入第%d个顶点的信息: ",l+1);
		scanf(" %c", &(G->Vertexs[l]));//%c前面加个空格 取消前面输入的enter enter也算是%c
	}

	for ( i = 0; i < G->VertexNum; i++)
	{
		int w = MAXVALUE;
		for (j= 0; j < G->VertexNum; j++)
		{
			G->arcs[i][j] = w;
		}
	}/*初始化邻接矩阵*/
	
	for ( k = 0; k < G->EdgeNum; k++)
	{
		printf("这是第%d条边,请输入起点,终点和权值;\n",k+1);
		scanf(" %c %c %d",&start,&end,&weight);
		for (i = 0; start != G->Vertexs[i]; i++);//查找起点
		for (j = 0; end != G->Vertexs[j]; j++);	//查找终点 
		G->arcs[i][j] = weight;//保存权值
		if (0 == G->GraphType)//如果是无向图
		{
			G->arcs[j][i] = weight;
			for ( count = 0; count < G->VertexNum; count++)
			{
				G->arcs[count][count] = 0;
			}
		}
	}
}

void  BFStraverse(MGraph G)
{    /* 广度优先遍历图G */
	int i,v;
	for (v = 0; v < G.VertexNum; v++)
		visited[v] = False;             /* 标志向量初始化*/
	for (i = 0; i < G.VertexNum; i++)
		if (!visited[i])
			BFS(G,i);  /*  vi未访问过,从vi开始BFS搜索*/
}

void  BFS(MGraph  G, int  v)
{     /* 以v为出发点,对图G进行BFS搜索*/
	int i, j;

	PSeqQueue  Q;
	Q = Init_SeqQueue();

	Visit(&G,v);                    /* 访问*/
	visited[v] = True;

	In_SeqQueue(Q,v);                      /* 原点入队列*/
	while (!Empty_SeqQueue(Q))
	{
		Out_SeqQueue(Q, &i);                  /* vi出队列*/
		for (j = 0; j < G.VertexNum; j++)              /* 依次搜索vi的邻接点vj */
			if (G.arcs[i][j] == 1 && !visited[j])   /* 若vj未访问*/
			{
				Visit(&G,j);                       /* 访问vj  */
				visited[j] = True;
				In_SeqQueue(Q, j);                    /* 访问过的v j入队列*/
			}
	}
	Destroy_SeqQueue(&Q);
}/*BFS*/

/*********************************************SEQ QUEUE*****************************************************/
PSeqQueue Init_SeqQueue()
{
	PSeqQueue Q;
	Q = (PSeqQueue)malloc(sizeof(struct SeqQueue));
	if (Q) {
		Q->front = 0;
		Q->rear = 0;
	}
	return Q;
}

int Empty_SeqQueue(PSeqQueue Q)
{
	if (Q&&Q->front == Q->rear)
		return 1;
	else
		return 0;
}

int In_SeqQueue(PSeqQueue Q, int x)
{
	if ((Q->rear + 1) % VERTEX_MAX == Q->front) {
		printf("队满!!");
		return -1;
	}
	else {
		Q->rear = (Q->rear + 1) % VERTEX_MAX;
		Q->data[Q->rear] = x;
		return 1;
	}
}

int Out_SeqQueue(PSeqQueue Q, int * x)
{
	if (Empty_SeqQueue(Q)) {
		printf("队空!");
		return -1;
	}
	else {
		Q->front = (Q->front + 1) % VERTEX_MAX;
		*x = Q->data[Q->front];
		return 1;
	}
}

void Destroy_SeqQueue(PSeqQueue *Q)
{
	if (*Q)
		free(*Q);
	*Q = NULL;
}

void Visit(MGraph *G,int v)
{
	printf("%c \t", G->Vertexs[v-1]);
}

 

 

 

 

转载于:https://my.oschina.net/ZhouHZ/blog/680125

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值