日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

邻接矩阵的深度优先遍历

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 邻接矩阵的深度优先遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

廢話不多說,直接看代碼

t#include<stdio.h> #include<stdlib.h> #include<string.h> #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 bool visted[MAX_VERTEX_NUM]; typedef char VertexType; typedef int VRType; typedef int QElemType; typedef enum { DG,DN,AG,AN }Graphkind; typedef struct ArcCell{//表征圖的連接關系 VRType adj; //連接關系 ArcCell *info; //附加信息 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{VertexType vexs[MAX_VERTEX_NUM];//頂點的類型 AdjMatrix arcs;//鄰接矩陣 int vexnum,arcnum;//圖的頂點數,邊數 Graphkind kind;//圖的類型 }Mgraph; typedef struct QNode{//隊列節點 QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;//隊列指針 void InitQueue(LinkQueue *Q) {//初始化隊列 (*Q).rear= (*Q).front=(QueuePtr)malloc(sizeof(QNode)) ;if(!(*Q).front)exit(-1);(*Q).front->next=NULL;}void EnQueue(LinkQueue *Q,QElemType e){//入隊操作 //if(((*Q).rear+1)%MAXQSIZE==(*Q).front)//exit(-1);QueuePtr p;(p)=(QueuePtr)malloc(sizeof(QNode)) ;p->data=e;p->next=NULL;(*Q).rear->next=p;(*Q).rear=p;}void DeQueue(LinkQueue *Q,QElemType *e){//出隊操作 // if((*Q).front==(*Q).rear)// exit(-1);QueuePtr p;if((*Q).front==(*Q).rear)exit(-1);p=(*Q).front->next;(*e)=p->data;(*Q).front->next=p->next;if((*Q).rear==p){(*Q).rear=(*Q).front;free(p);}}int QueueEmpty(LinkQueue Q){//判斷隊列是否為空 if((Q).front==(Q).rear)return 1;return 0;} void CreateG(Mgraph &G,int kind) //創建圖 { int i,j; printf("Construct the Graph...\n"); if(kind ==1){G.vexnum=8; G.arcnum=9; G.kind= AG; }else{G.vexnum=8; G.arcnum=12; G.kind= DG;}for(i=0;i<MAX_VERTEX_NUM;i++) //鄰接矩陣的初始化 { for(j=0;j<MAX_VERTEX_NUM;j++) { G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL; } } G.vexs[0]='a'; //頂點賦值 G.vexs[1]='b'; G.vexs[2]='c'; G.vexs[3]='d'; G.vexs[4]='e'; G.vexs[5]='f'; G.vexs[6]='g'; G.vexs[7]='h'; if(kind ==1){G.arcs[0][1].adj=1; //鄰接矩陣賦值 G.arcs[0][1].info=NULL; G.arcs[1][0].adj=1; G.arcs[1][0].info=NULL; G.arcs[1][3].adj=1; G.arcs[1][3].info=NULL; G.arcs[3][1].adj=1; G.arcs[3][1].info=NULL; G.arcs[3][7].adj=1; G.arcs[3][7].info=NULL; G.arcs[7][3].adj=1; G.arcs[7][3].info=NULL; G.arcs[4][7].adj=1; G.arcs[4][7].info=NULL; G.arcs[7][4].adj=1; G.arcs[7][4].info=NULL; G.arcs[4][1].adj=1; G.arcs[4][1].info=NULL; G.arcs[1][4].adj=1; G.arcs[1][4].info=NULL; G.arcs[0][2].adj=1; G.arcs[0][2].info=NULL; G.arcs[2][0].adj=1; G.arcs[2][0].info=NULL; G.arcs[2][5].adj=1; G.arcs[2][5].info=NULL; G.arcs[5][2].adj=1; G.arcs[5][2].info=NULL; G.arcs[2][6].adj=1; G.arcs[2][6].info=NULL; G.arcs[6][2].adj=1; G.arcs[6][2].info=NULL; G.arcs[5][6].adj=1; G.arcs[5][6].info=NULL; G.arcs[6][5].adj=1; G.arcs[6][5].info=NULL; }else{G.arcs[0][1].adj=1; //鄰接矩陣賦值 G.arcs[0][1].info=NULL; G.arcs[0][3].adj=1; //鄰接矩陣賦值 G.arcs[0][3].info=NULL; G.arcs[1][2].adj=1; G.arcs[1][2].info=NULL; G.arcs[2][5].adj=1; G.arcs[2][5].info=NULL; G.arcs[2][3].adj=1; G.arcs[2][3].info=NULL; G.arcs[3][4].adj=1; G.arcs[3][4].info=NULL; G.arcs[4][2].adj=1; G.arcs[4][2].info=NULL; G.arcs[4][6].adj=1; G.arcs[4][6].info=NULL; G.arcs[5][4].adj=1; G.arcs[5][4].info=NULL; G.arcs[5][7].adj=1; G.arcs[5][7].info=NULL; G.arcs[6][7].adj=1; G.arcs[6][7].info=NULL;G.arcs[7][4].adj=1; G.arcs[7][4].info=NULL; } printf("Construction of Graph OK!\n\n"); return; } void ShowAdjMat(Mgraph G) //鄰接矩陣的顯示 { int i,j; printf("The adjacent matrix is:\n"); for(i=0;i<G.vexnum;i++) { for(j=0;j<G.vexnum;j++) { printf("%d ",G.arcs[i][j].adj); } printf("\n"); } printf("\n"); return; } int GetNextVertex(Mgraph G,int v) //獲取下一頂點 { int i; for(i=0;i<G.vexnum;i++) { if(G.arcs[v][i].adj==1&& visted[i]==false) { return i; } } return -1; } void DFS(Mgraph G,int v) //深度優先搜索 { int i; int nextid; printf("%c ",G.vexs[v]); visted[v]=true; while(1) { nextid=GetNextVertex(G,v); if(nextid!=-1 && visted[nextid]==false) { DFS(G,nextid); } else { break; } } } void DFSTraverse(Mgraph G) //深度優先搜索 { int i; printf("The depth first traverse result is:\n"); for(i=0;i<G.vexnum;i++) { visted[i]=false; } for(i=0;i<G.vexnum;i++) { if(visted[i]!=true) { DFS(G,i); } } } void BFSTraverse(Mgraph G){int v,w,u;LinkQueue Q; for(v=0;v<G.vexnum;++v) visted[v]=false;InitQueue(&Q); //置空的輔助隊列Qprintf("The depth first traverse result is:\n"); for(v=0;v<G.vexnum;++v)if(!visted[v]) { //v尚未訪問visted[v]=true;printf("%c ",G.vexs[v]); EnQueue(&Q,v);while(!QueueEmpty(Q)) {DeQueue(&Q,&u);//隊頭元素出隊并置為ufor(w=u; w>=0; w=GetNextVertex(G,u))if(!visted[w]) { //w為u的尚未訪問的鄰接頂點visted[w]=true;printf("%c ",G.vexs[w]); EnQueue(&Q,w);}//if}//while}//if }int main() { Mgraph G,G2; printf("無向圖:\n");CreateG(G,1); ShowAdjMat(G); DFSTraverse(G); printf("\n\n");printf("有向圖:\n"); CreateG(G2,2); ShowAdjMat(G2); BFSTraverse(G2); printf("\n\n"); system("pause"); return 0; }

?

總結

以上是生活随笔為你收集整理的邻接矩阵的深度优先遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。