數據結構之DFS與BFS


 

深度搜索(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 }

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM