#include<stdio.h>
#include<malloc.h>
#define MAXLEN 100
/*邻接点域*/
typedef struct node{
int adjnum;
char adjvex;
struct node *next;
}EdgeNode;
/*顶点域*/
typedef struct vnode{
char vertex;
EdgeNode *firstedge;
}Vnode;
typedef Vnode AdjList[MAXLEN];
typedef struct {
AdjList adlist;
int n, e;
}ALGraph;
typedef struct QNode{
int data;
struct QNode *next;
}QNode, *QePtr;
typedef struct{
QePtr front;
QePtr rear;
}QPtr;
int visited[MAXLEN];
void DFS(ALGraph *G, int i);
/
/*广度优先搜索,队列*/
/*队列中存入序号*/
/*队列的初始化*/
void InitQueue(QPtr &Q){
Q.front = Q.rear = (QePtr)malloc(sizeof(QNode));
if(!Q.front){
printf("error");
exit(0);
}
Q.front->next = NULL;
}
/*第i个顶点如队*/
void EnQueue(QPtr &Q, int e){
QePtr p;
//插入元素为Q的新的队尾元素
p = (QePtr)malloc(sizeof(QNode));
if(!p){
printf("error");
exit(0);
}
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
void DeQueue(QPtr &Q, int &e){
//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK
//否则返回ERROR
QePtr p;
if(Q.front == Q.rear)
return;
/*Q.front是不存有效数据的QPtr类型的一段内存的首地址,
反正不用它*/
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if(Q.rear == p)
Q.front = Q.rear;
}
int QueueEmpty(QPtr Q){
if(Q.front == Q.rear)
return 1;
else
return 0;
}
//
void BFS(ALGraph *G){
QPtr Q;
EdgeNode *p;
int k, flag;
for(k=0; k<G->n; k++)
visited[k] = 0;
InitQueue(Q);
for(k=0; k<G->n; k++){
if(!visited[k]){
visited[k] = 1;
printf("%c ", G->adlist[k].vertex);
EnQueue(Q, k);
while(!QueueEmpty(Q)){
DeQueue(Q, flag);
p = G->adlist[flag].firstedge;
while(1){
if(!visited[p->adjnum]){
visited[p->adjnum] = 1;
printf("%c ", G->adlist[p->adjnum].vertex);
EnQueue(Q, p->adjnum);
}
if(p->next == NULL)break;
p = p->next;
}
}
}
}
}
/
void CreatGraph(ALGraph *G){
int i, j, k;
EdgeNode *p;
printf("输入顶点数和边数:\n");
scanf("%d%d", &G->n, &G->e);
printf("初始化顶点域:\n");
for(i=0; i<G->n; i++){
getchar();
printf("输入第%d个顶点信息:", i+1);
scanf("%c", &G->adlist[i].vertex);
G->adlist[i].firstedge = NULL;
}
printf("初始化边的信息:\n");
for(k=0; k<G->e; k++){
printf("输入第%d条边的首尾顶点:",k+1);
scanf("%d%d", &i, &j);
/*将第j条边接到顶点i的后面*/
p = (EdgeNode *)malloc(sizeof(EdgeNode));
p->next = NULL;
p->adjnum = j;
p->adjvex = G->adlist[j].vertex;
p->next = G->adlist[i].firstedge;
G->adlist[i].firstedge = p;
/*将第i条边接到顶点j的后面*/
p = (EdgeNode *)malloc(sizeof(EdgeNode));
p->next = NULL;
p->adjnum = i;
p->adjvex = G->adlist[i].vertex;
p->next = G->adlist[j].firstedge;
G->adlist[j].firstedge = p;
}
}
void PrintGraph(ALGraph *G){
int i;
EdgeNode *p;
for(i=0; i<G->n; i++){
printf("%c ", G->adlist[i].vertex);
p = G->adlist[i].firstedge;
while(1){
printf("%c ", p->adjvex);
if(p->next == NULL) break;
p = p->next;
}
printf("\n");
}
/*
for(i=0; i<=4; i++){
printf("%c ", G->adlist[i].vertex);
}*/
}
main(){
ALGraph *G;
G = (ALGraph *)malloc(sizeof(ALGraph));
CreatGraph(G);
PrintGraph(G);
BFS(G);
printf("\n");
}
邻接表表示的广度优先搜索
最新推荐文章于 2023-01-15 00:12:15 发布