您的位置:首页 > 其它

邻接表表示的广度优先搜索

2012-11-30 16:53 274 查看
#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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: