1. 程式人生 > >數據結構之DFS與BFS

數據結構之DFS與BFS

存儲 reat pac name 無向圖 using style 頂點 分享

技術分享圖片

深度搜索(DFS) and 廣度搜索(BFS)

代碼如下:

  1 #include "stdafx.h"
  2 #include<iostream>
  3 #include<string>
  4 using namespace std;
  5 #define MAX 30
  6 #define MVNum 100
  7 #define ERROR 1 
  8 typedef char VerTexType;
  9 typedef int Status;
 10 typedef int QElemType;
 11 #define
MAXSIZE 100 12 #define OK 1 13 #define ERROR 0 14 #define OVERFLOW -2 15 typedef struct ArcNode //邊結點 16 { 17 int adjvex; //改變所指向的頂點的位置 18 struct ArcNode *nextarc; //指向下一條邊的指針 19 string info; //和邊相關的信息 20 }ArcNode;
21 typedef struct VNode //頂點信息 22 { 23 VerTexType data; 24 struct ArcNode *link; //指向第一條依附該頂點的邊的指針 25 }VNode; //AdList表示鄰接表類型 26 typedef struct //鄰接表 27 { 28 VNode xlist[MAX]; 29 int vexnum, arcnum; //
圖的當前頂點數和邊數 30 }ALGraph; 31 32 typedef struct Node //構造隊列 33 { 34 int data; 35 struct Node *next; 36 }Node,*QNode; 37 typedef struct 38 { 39 QNode front; //隊頭指針 40 QNode rear; //對尾指針 41 }Queue; 42 Status InitQueue(Queue &Q) //初始化隊列 43 { 44 Q.front = Q.rear=new Node; //生成新節點作為頭節點,對頭和隊尾指針指向此節點 45 if (!Q.front) 46 exit(OVERFLOW); 47 Q.front->next = NULL; //頭結點的指針域置空 48 return OK; 49 } 50 51 Status EnQueue(Queue &Q, int e) //入隊操作 52 { 53 QNode p = new Node; 54 if (!p) //存儲分配失敗 55 exit(OVERFLOW); 56 p->data = e; 57 p->next = NULL; 58 Q.rear->next = p; 59 Q.rear = p; //把當前的p設置尾對尾節點,rear指向p 60 return OK; 61 } 62 63 Status DeQueue(Queue &Q, int &e) //出隊操作 64 { 65 QNode p; 66 p = Q.front->next; //將欲刪除的對頭結點暫存給p 67 Q.front->next = p->next; //將原隊頭節點後繼p->next賦值給頭結點後繼 68 if (Q.rear == p) //如果隊頭是隊尾,則刪除後將rear指向頭節點 69 Q.rear = Q.front; 70 e = p->data; //將欲刪除的對接點賦值給e 71 delete p; 72 return OK; 73 } 74 75 Status QueueEmpty(Queue Q) //隊列判空 76 { 77 if (Q.rear == Q.front) 78 return 1; 79 else 80 return 0; 81 } 82 83 int LocateVex(ALGraph &G, char &v) //定位函數 84 { 85 int i; 86 for (i = 0; i < G.vexnum; i++) 87 { 88 if (G.xlist[i].data == v) 89 return i; 90 } 91 if (i >= G.vexnum) 92 return ERROR; 93 else 94 return 0; 95 } 96 void CreateUDG(ALGraph &G) //創建無向圖 97 { 98 ArcNode *p1, *p2; 99 int i, j, k; 100 char v1, v2; 101 cout << "請輸入圖的頂點數、邊數:" << endl; 102 cin >> G.vexnum >> G.arcnum; //輸入總頂點數,總邊數 103 cout << "請輸入頂點的值:(頂點之間用空格分離)" << endl; 104 for (i = 0; i < G.vexnum; i++) 105 { 106 cin >> G.xlist[i].data; //輸入頂點值 107 G.xlist[i].link = NULL; //初始化表頭結點的指針域為NULL 108 } 109 cout << "請輸入弧尾和弧頭:" << endl; 110 for (k = 0; k < G.arcnum; k++) 111 { 112 cin >> v1 >> v2; //輸入各邊,構造鄰接表 113 i = LocateVex(G, v1); 114 j = LocateVex(G, v2); 115 p1 = new ArcNode; //生成一個新結點*p1 116 p1->adjvex = j; //鄰接點序號為j 117 p1->nextarc = G.xlist[i].link; 118 G.xlist[i].link = p1; 119 p2 = new ArcNode; 120 p2->adjvex = i; 121 p2->nextarc = G.xlist[j].link; 122 G.xlist[j].link = p2; 123 } 124 cout << "圖構建成功!" << endl<<endl; 125 } 126 127 static bool visited[MAX]; //訪問過visited,為1否則為0 128 129 void DFS(ALGraph G, int m) //深度優先搜索 130 { 131 visited[m] = true; //標記已經遍歷過 132 cout << G.xlist[m].data<<" "; 133 ArcNode *p = G.xlist[m].link; 134 while (p) 135 { 136 if (!visited[p->adjvex]) 137 DFS(G, p->adjvex); 138 p = p->nextarc; 139 } 140 } 141 142 void BFS(ALGraph G,int n) //廣度優先搜索 143 { 144 ArcNode *p; 145 Queue Q; 146 for (int i = 0; i < G.vexnum; i++) 147 visited[i] = false; 148 InitQueue(Q); 149 for (int i = 0; i < G.vexnum; i++) 150 { 151 if (!visited[i]) 152 { 153 visited[i] = true; 154 cout << G.xlist[i].data<<" "; 155 EnQueue(Q, i); 156 while (!QueueEmpty(Q)) 157 { 158 DeQueue(Q, i); 159 p = G.xlist[i].link; //找到當前頂點編表鏈表頭指針 160 while (p) 161 { 162 if (!visited[p->adjvex])//若此頂點未訪問 163 { 164 visited[p->adjvex] = true; 165 cout << G.xlist[p->adjvex].data<<" "; 166 EnQueue(Q, p->adjvex);//將此頂點入隊列 167 } 168 p = p->nextarc; //指針指向下一個鄰接點 169 } 170 } 171 } 172 } 173 } 174 175 void coutGraphD(ALGraph G) //深搜輸出函數 176 { 177 for (int i = 0; i < G.vexnum; i++) 178 visited[i] = false; 179 cout << "深度優先搜索輸出的頂點的結果為:" << endl; 180 for (int i = 0; i < G.vexnum; i++) 181 if (!visited[i]) 182 DFS(G, i); 183 cout << endl; 184 } 185 void coutGraphW(ALGraph G) //廣搜輸出函數 186 { 187 for (int i = 0; i < G.vexnum; i++) 188 visited[i] = false; 189 cout << "廣度優先搜索輸出的頂點的結果為:" << endl; 190 for (int i = 0; i < G.vexnum; i++) 191 if (!visited[i]) 192 BFS(G, i); 193 cout << endl; 194 195 } 196 int main() 197 { 198 ALGraph MG; 199 CreateUDG(MG); 200 coutGraphD(MG); 201 coutGraphW(MG); 202 return 0; 203 }

運行結果:

技術分享圖片

數據結構之DFS與BFS