数据结构---邻接表的BFS
生活随笔
收集整理的這篇文章主要介紹了
数据结构---邻接表的BFS
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)據(jù)結(jié)構(gòu)—鄰接表的BFS
原理:參考趣學(xué)數(shù)據(jù)結(jié)構(gòu)
代碼:
隊列代碼:
#pragma once #define elemType int #define N 100 #include<stdlib.h> typedef struct dQueue {int data;struct dQueue* next; }dQueue; typedef struct queue {dQueue *front, *rear; }queue; bool initQueue(queue &Queue) {//初始化隊列//Queue.front = new dQueue;Queue.front = Queue.rear = (dQueue*)malloc(sizeof(dQueue));if (!Queue.front) {return false;}Queue.front->next = NULL;//頭結(jié)點return true; } int getQueueTopElem(queue &Queue) {//獲取隊列隊頭的元素int u = -1;if (Queue.front != Queue.rear) {dQueue* p = Queue.front->next;u = p->data;}return u; } bool enQueue(queue &Queue, int e) {//入隊dQueue* p = Queue.rear;dQueue* s = (dQueue*)malloc(sizeof(dQueue));s->data = e;s->next = NULL;p->next = s;Queue.rear = s;return true; } bool deQueue(queue &Queue, int &e) {//出隊if (Queue.front == Queue.rear) {return false;//空隊}dQueue* p = Queue.front->next;e = p->data;Queue.front->next = p->next;if (p == Queue.rear) {//隊尾只有一個元素的時候Queue.rear = Queue.front;}delete p;return true; } bool emptyQueue(queue Queue) {//隊列為空的判斷if (Queue.front == Queue.rear) {return true;}return false; }BFS代碼:
#include<stdio.h> #include<stdlib.h> #include"queue.h" #define typeNode int //每個頭結(jié)點的標識數(shù)據(jù)類型 #define N 100 //最大結(jié)點數(shù) int degree[N]; int result[N]; bool visited[N]; typedef struct dNode {//每個頭結(jié)點后緊跟的單位結(jié)點int data;struct dNode * next; }dNode; typedef struct mNode {//鄰接表中每一行的頭結(jié)點typeNode data;dNode * first;//指向第一個有效的后繼結(jié)點 }mNode; typedef struct {mNode vNode[N];//所有頭結(jié)點int vNum, eNum;//圖中頂點的數(shù)量和邊數(shù)量 }zNode; void init(zNode &ZNode) {printf("規(guī)定頂點從0開始取\n");scanf_s("%d%d", &ZNode.vNum, &ZNode.eNum);//輸入有向圖的頂點數(shù)和邊數(shù)for (int i = 0; i < ZNode.vNum; i++) {//規(guī)定頂點從0開始取scanf_s("%d", &ZNode.vNode[i].data);ZNode.vNode[i].first = NULL;}for (int i = 0; i < ZNode.eNum; i++) {//頭插法int u, v;scanf_s("%d%d", &u, &v);//u頂點到v頂點有邊dNode* p = new dNode();p->data = v;p->next = ZNode.vNode[u].first;//只有指針域,指向地址ZNode.vNode[u].first= p;} } void print14(zNode ZNode) {printf("遍歷鏈表:\n");for (int i = 0; i < ZNode.vNum; i++) {dNode* temp = ZNode.vNode[i].first;printf("%d ->", ZNode.vNode[i].data);while(temp){printf("%d ->",temp->data);temp = temp->next;}printf("NULL\n");} } void BFSLinkGraph(zNode ZNode, int u) {//鄰接表的DFSqueue Queue;initQueue(Queue);visited[u] = true;enQueue(Queue, u);while (!emptyQueue(Queue)) {u = getQueueTopElem(Queue);printf("%d ", u);int e = -1;deQueue(Queue, e);dNode* p=ZNode.vNode[u].first;while (p) {int i = p->data;if (!visited[i]) {visited[i] = true;enQueue(Queue, i);}p = p->next;}} } int main() {zNode ZNode;printf("鄰接表的構(gòu)造:\n");init(ZNode);print14(ZNode);for (int i = 0; i < ZNode.vNum; i++) {visited[i] = false;}printf("BFS遍歷鄰接表\n");BFSLinkGraph(ZNode, 0);printf("\n");system("pause");return 0; }測試截圖:
時間復(fù)雜度為O(n+e),空間復(fù)雜度為O(n)
如果存在什么問題,歡迎批評指正!謝謝!
總結(jié)
以上是生活随笔為你收集整理的数据结构---邻接表的BFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BNP正常值
- 下一篇: 数据结构---prim最小生成树