利用鄰接矩陣儲存無向圖,並實現BFS(非遞迴) DFS(遞迴+非遞迴)兩種遍歷
阿新 • • 發佈:2019-02-17
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; //------------鄰接矩陣----------- #define MAX 20 typedef char Dtype; typedef int mapmax[MAX][MAX]; int visited[MAX]; typedef struct{ int dian,hu; Dtype d[MAX]; mapmax map; }M; //-----------------棧------------------ typedef struct{ int *base; int top; int size; }Stack; int Gettop(Stack S,int &e); void Pop(Stack &S,int &e); void Push(Stack &S,int e); int Isempty(Stack S); void InitStack(Stack &S); int locate(M G,Dtype a); void creat_map(M &G); //------------佇列---------------------- typedef struct { //佇列 int *base; int front; int rear; int tag; }Sq; void InitSq(Sq &QQ); int Getlen(Sq QQ); int Isempty(Sq QQ); void InSq(Sq &QQ,int e); void OutSq(Sq &QQ,int &e); void GetHead(Sq QQ,int &e); //-----------------DFS-digui-------------------- int first(M G,int i); int next(M G,int i,int w); void DFS1(M G,int i); //-----------------DFS-fei-digui------------------ void DFS(M G,int v); //-----------------BFS-------------------- void BFS(M G) { Sq q; InitSq(q); int v,e; for(int i=1;i<=G.dian;i++) { if(!visited[i]) { cout<<G.d[i]<<" "; visited[i]=1; InSq(q,i); } GetHead(q,v); for(int j=2;j<=G.dian;j++) { if(G.map[v][j]==1 && !visited[j]) { cout<<G.d[j]<<" "; visited[j]=1; InSq(q,j); } } OutSq(q,e); } } int main() { M G; memset(visited,0,sizeof(visited)); memset(G.map,0,sizeof(G.map)); creat_map(G); // BFS(G); for(int i=1;i<=G.dian;i++) { if(!visited[i]) DFS1(G,i); } return 0; } //--------------------------DFS fei digui------------------ void DFS(M G,int v) { Stack S;InitStack(S); visited[v]=1; cout<<G.d[v]<<" "; Push(S,v); int e; while(!Isempty(S)) { Gettop(S,v); for(int i=1;i<=G.dian;i++) { if(G.map[v][i]==1 && !visited[i]) { cout<<G.d[i]<<" "; Push(S,i); visited[i]=1; v=i; i=1; } } if(!Isempty(S)) Pop(S,e); } } //-----------------DFS---digui------------------ int next(M G,int i,int w) { for(int j=w+1;j<=G.dian;j++) { if(G.map[i][j]==1) { G.map[i][j]==0; return j; } } return 0; } void DFS1(M G,int i) { int w=1; visited[i]=1; cout<<G.d[i]; for(w=next(G,i,w);w>0;w=next(G,i,w)) //利用next函式不斷尋找節點指向的下一個元素 { if(!visited[w]) { DFS1(G,w); } } } //-----------------鄰接矩陣------------------------------ int locate(M G,Dtype a) { for(int i=1;i<=G.dian;i++) { if(a==G.d[i]) return i; } return 0; } void creat_map(M &G) {//輸入無向圖的頂點數及弧數,建立G無向圖 Dtype x,y; printf("請輸入點數和弧數\n"); cin>>G.dian>>G.hu; getchar(); printf("請輸入%d個點\n",G.dian); for(int i=1;i<=G.dian;i++) cin>>G.d[i]; memset(G.map,0,sizeof(G.map)); printf("請輸入%d條弧\n",G.hu); getchar(); for(int k=0;k<G.hu;k++) { int i,j; cin>>x>>y; // printf("x=%c y=%c ",x,y); getchar(); i=locate(G,x);j=locate(G,y); G.map[i][j]=G.map[j][i]=1; } } //---------------------棧----------------- //初始化 void InitStack(Stack &S) { S.base=(int *)malloc(MAX*sizeof(int)); if(!S.base) return ; S.top=0; S.size=MAX; } //判空操作,返回 1 表示棧為空 int Isempty(Stack S) { if(S.top==0) return 1; return 0; } //入棧操作 void Push(Stack &S,int e) { if(S.top>=S.size) { printf("該棧已滿\n"); return ; } S.base[S.top++]=e; } //出棧操作 void Pop(Stack &S,int &e) { if (Isempty(S)) return; //棧為空 e = S.base[--S.top]; } //Gettop 取棧頂元素 int Gettop(Stack S,int &e){ //若棧不空則用e返回S的棧頂元素 if (S.top == 0) return 0; //棧為空 e = S.base[S.top-1]; return e; } //----------------佇列---------------- void InitSq(Sq &QQ) { QQ.base=(int*)malloc(MAX * sizeof(int)); //S.base=(BiTree*)malloc(MAX*sizeof(BiTree)); if(!QQ.base) return ; QQ.front=QQ.rear=QQ.tag=0; } int Getlen(Sq QQ) { if(!QQ.tag) //分情況討論tag為 0,長度肯定為 0; return 0; else { if(QQ.rear==QQ.front) return MAX; return (QQ.rear-QQ.front+MAX)%MAX; } } int Isempty(Sq QQ) { if(QQ.front==QQ.rear && QQ.tag==0) return 1; return 0; } void InSq(Sq &QQ,int e) { if (QQ.front == QQ.rear && QQ.tag==1) //tag與隊頭隊尾必須同時滿足 { printf("%d\n",QQ.tag); printf("佇列已滿\n"); return ; } QQ.tag=1; QQ.base[QQ.rear] = e; QQ.rear =(QQ.rear+1)%MAX; } void OutSq(Sq &QQ,int &e) { if(QQ.front == QQ.rear && QQ.tag==0) { printf("佇列已空\n"); return; } e=QQ.base[QQ.front]; QQ.front=(QQ.front+1)%MAX; if(QQ.front == QQ.rear) QQ.tag=0; } void GetHead(Sq QQ,int &e) { if(QQ.front == QQ.rear && QQ.tag==0) return; e = QQ.base[QQ.front]; }