#include<iostream> #define MAX_VERTEX_NUM 50 using namespace std; typedef char VerType; typedef struct ArcNode //定義弧結點所在位置, { int adj; int info; ArcNode *next; }ArcNode; typedef struct VerNode //定義頂點(頂點數據,頂點所指向第一條弧的指針) { VerType data; ArcNode *first; }VerNode; typedef struct AdjList //圖的定義 { VerNode VerNodes[MAX_VERTEX_NUM]; //頂點集 int verNum,arcNum; //頂點數,弧數 }AdjList; typedef struct Queue //FIFO隊列 { int Item[MAX_VERTEX_NUM]; int front,rear; }Queue; int visited[MAX_VERTEX_NUM]; //頂點訪問標誌數組 //定位某一結點的位置,找不到返回0 int LocateGraph(AdjList *g,char data) { for(int i=1;i<=g->verNum;i++) { if(g->VerNodes[i].data==data) return i; } return 0; } //初始化隊列 void InitQueue(Queue *Q) { for(int i=1;i<=MAX_VERTEX_NUM;i++) { Q->Item[i]=0; } Q->front=Q->rear=1; } //建立圖的鄰接表 void CreateAdjList(AdjList *g) { int s,d,weigth; char sChar,dChar; ArcNode *q=NULL; cout<<"輸入圖的頂點數,弧數\n"; cin>>g->verNum>>g->arcNum; cout<<"輸入每一個頂點的信息\n"; //初始化頂點 for(int i=1;i<=g->verNum;i++) { cin>>g->VerNodes[i].data; g->VerNodes[i].first=NULL; } //初始化弧 for(i=1;i<=g->arcNum;i++) { cout<<"輸入第"<<i<<"條弧的起始,目的,弧的權值"<<endl; cin>>sChar>>dChar>>weigth; s=LocateGraph(g,sChar); d=LocateGraph(g,dChar); //定位該頂點的位置 q=(ArcNode *)malloc(sizeof(ArcNode)); q->adj=d;q->info=weigth; q->next=g->VerNodes[s].first; g->VerNodes[s].first=q; } } // void InitVisited(AdjList *g) { for(int i=1;i<=g->verNum;i++) { visited[i]=0; } } //訪問頂點值 void visit(AdjList *g,int v) { cout<<g->VerNodes[v].data<<endl; } //深度遍歷圖 void DFSTransfer(AdjList *g,int v) { visit(g,v);visited[v]=1; ArcNode *q=NULL; q=g->VerNodes[v].first; while(q!=NULL) { if(!visited[q->adj]) { DFSTransfer(g,q->adj); q=q->next; } } } //廣度遍歷v頂點 void BFS(AdjList *g,int v) { ArcNode *q=NULL; Queue *Q=(Queue *)malloc(sizeof(Queue)); InitQueue(Q); Q->Item[Q->rear]=v;visit(g,v);visited[v]=1; Q->rear=(Q->rear+1)%MAX_VERTEX_NUM; while(Q->front!=Q->rear) { v=Q->Item[Q->front]; Q->front=(Q->front+1)%MAX_VERTEX_NUM; q=g->VerNodes[v].first; while(q!=NULL) { if(!visited[q->adj]) { visit(g,q->adj); visited[q->adj]=1; Q->Item[Q->rear]=q->adj; Q->rear=(Q->rear+1)%MAX_VERTEX_NUM; q=q->next; } } } } //廣度遍歷圖 void BFSTransfer(AdjList *g) { InitVisited(g); for(int i=1;i<=g->verNum;i++) { if(!visited[i]) { BFS(g,i); } } cout<<endl; } int main() { AdjList *g=(AdjList*)malloc(sizeof(AdjList)); CreateAdjList(g); cout<<"---------------------廣度優先搜索----------------------"<<endl; BFSTransfer(g); cout<<"---------------------深度優先搜索----------------------"<<endl; InitVisited(g); DFSTransfer(g,1); return 0; }