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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值