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

#define _CRT_SECURE_NO_WARNINGS

#include

#include

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

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值