- /*******************************************************************************/
- bool visited[MAXVEX];//訪問標識數組
- void DFS(MGraph MG,int i){//鄰接矩陣的深度優先遞歸算法
- int j;
- visited[i] = true;//修改i的訪問標識
- printf("%c ",MG.vexs[i]);//打印頂點,也可以換成其他操作
- for(j=0;j<numVertexes;j++){//對訪問的結點的鄰接點進行遞歸調用
- if(MG.arc[i][j]==1 && !visited[j]){//如果相關的邊存在,而且結點還沒有被訪問,就遞歸
- DFS(MG,j);
- }
- }
- }
- void DFSTraverse(MGraph MG){
- int i;
- for(i=0;i<MG.numVertexes;i++){//初始化訪問標識數組,均設置成未訪問狀態
- visited[i] = false;
- }
- for(i=0;i<MG.numVertexes;i++){//
- if(!visited[i]){//如果是連通圖,只會執行一次
- DFS(MG,i);
- }
- }
- }
- /*******************************************************************************/
- void DFS(GraphAdjList GL,int i){//鄰接表的深度優先遞歸算法
- EdgeNode *p;
- visited[i] = true;
- printf("%c ",GL->adjList[i].data);//打印,也可以是其他操作
- p = GL->adjList[i].firstedge;//指向下一個鄰接點
- while(p){//如果不爲空
- if(!visited[p->adjvex])//如果還沒有被訪問過
- DFS(GL,p->adjvex);//遞歸調用
- }
- p = p->next;
- }
- }
- void DFS(GraphAdjList GL){
- int i;
- for(i=0;i<GL->numVertexes;i++){//初始化所有都是未訪問狀態
- visited[i] = false;
- }
- for(i=0;i<GL->numVertexes;i++){
- if(!visited[i]){//如果是連通圖,只會執行一次
- DFS(GL,i);
- }
- }
- }
- /*******************************************************************************/
- void BFSTraverse(MGraph MG){//鄰接矩陣的廣度優先遞歸算法
- int i,j;
- Queue Q;//廣度遍歷相當於層次遍歷,需要一個隊列
- for(i=0;i<MG.numVertexes;i++){
- visited[i] = false;
- }
- initQueue(&Q);
- for(i=0;i<MG.numVertexes;i++){
- if(!visited[i]){//如果是連通圖,僅執行一次這句話
- visited[i] = true;//先打印
- printf("%c",G.vexs[i]);//
- EnQueue(&Q,i);//後入隊
- while(!QueueEmpty(Q)){
- DeQueue(&Q,&i);//出隊
- for(j=0;j<MG.numVertexes;j++){
- if(MG.arc[i][j] == 1 && !visited[j]){//相關的鄰接點如果還沒有訪問就入隊
- visited[j] = true;//先打印
- printf("%c",MG.vex[j]);
- EnQueue(&Q,j);//後入隊
- }
- }
- }
- }
- }
- }
- /*******************************************************************************/
- void BFSTraverse(GraphAdjList GL){//鄰接表的廣度優先遞歸算法
- int i;
- EdgeNode *p;
- Queue Q;
- for(i=0;i<GL->numVertexes;i++){
- visited[i] = false;
- }
- initQueue(&Q);
- for(i=0;i<GL->numVertexes;i++){
- if(!visited[i]){
- visited[i] = true;
- printf("%c",GL->adjList[i].data);
- EnQueue(&Q,i);
- while(!QueueEmpty(Q)){
- DeQueue(&Q,&i);
- p = GL->adjList[i].firstedge;//找到當前結點指向邊表的頭指針
- while(p){
- if(!visited[p->adjvex]){//如果沒有訪問,一次訪問併入棧
- visited[p->adjvex] = true;
- printf("%c",GL->adjList[p->adjvex].data);
- EnQueue(&Q,p->adjvex);
- }
- p=p->next;//指針指向下一個鄰接點
- }
- }
- }
- }
- }