国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言數據結構之圖的遍歷實例詳解

2020-01-26 14:02:08
字體:
來源:轉載
供稿:網友

C語言數據結構之圖的遍歷實例詳解

輸入一組頂點,建立無向圖的鄰接矩陣。輸入一組頂點,建立有向圖的鄰接表。分別對無向圖和有向圖進行DFS(深度優先遍歷)和BFS(廣度優先遍歷)。寫出深度優先遍歷的遞歸和非遞歸算法。根據建立的有向圖,判斷該圖是否是有向無環圖,若是,則輸出其一種拓撲有序序列。

實現代碼:

#include <stdio.h> #include <stdlib.h> #define MAX 20  typedef struct ArcNode{   int adjvex;   struct ArcNode *nextarc; }ArcNode;  typedef struct{   char data;   ArcNode *firstarc; }AdjList[MAX];  typedef struct{   AdjList vertices;   int vexnum;   int arcnum; }ALGraph;  typedef struct{   int *base;   int front,rear; }CqQueue;  void InitQueue(CqQueue &Q) {//初始化一個隊列   Q.base=(int*)malloc(MAX*sizeof(int));   Q.front=Q.rear=0; }  int QueueEmpty(CqQueue Q) {//判斷隊列是否為空   if(Q.rear==Q.front)     return 1;   return 0; }  void EnQueue(CqQueue &Q,int e) {//入隊操作   if((Q.rear+1)%MAX==Q.front)     return;   Q.base[Q.rear]=e;   Q.rear=(Q.rear+1)%MAX; }  void DeQueue(CqQueue &Q,int &e) {//出隊操作   if(Q.rear==Q.front)     return;   e=Q.base[Q.front];   Q.front=(Q.front+1)%MAX; }  int LocateVex(ALGraph G,char v) {//查找頂點v在圖G中的位置   for(int i=0;i<G.vexnum;i++)     if(G.vertices[i].data==v)       return i;   return -1;     for(int i=0;i<G.vexnum;i++)     if(G.vexs[i]==v)       return i;   return -1; }  void CreateAdjList(ALGraph &G) {//建立無向圖的鄰接表   int v,i,j,k;   char v1,v2;   ArcNode *p,*s;   printf("輸入無向圖的頂點數和邊數:/n");   scanf("%d%d",&G.vexnum,&G.arcnum);   getchar();   printf("輸入圖的頂點信息:/n");   for(v=0;v<G.vexnum;v++){     scanf("%c",&G.vertices[v].data);getchar();     G.vertices[v].firstarc=NULL;   }      printf("輸入無向圖的邊:/n");   for(k=0;k<G.vexnum;k++){     scanf("%c%c",&v1,&v2);     getchar();     i=LocateVex(G,v1);     j=LocateVex(G,v2);     s=(ArcNode*)malloc(sizeof(ArcNode));     s->adjvex=j;     s->nextarc=NULL;     if(!G.vertices[i].firstarc)       G.vertices[i].firstarc=s;     else{       p=G.vertices[i].firstarc;       while(p->nextarc)         p=p->nextarc;       p->nextarc=s;     }     s=(ArcNode*)malloc(sizeof(ArcNode));     s->adjvex=i;     s->nextarc=NULL;     if(!G.vertices[j].firstarc)       G.vertices[j].firstarc=s;     else{       p=G.vertices[j].firstarc;       while(p->nextarc)         p=p->nextarc;       p->nextarc=s;     }   } }  int visited[MAX];  void DFS(ALGraph G,int v) {//從頂點v開始對圖G進行深度優先搜索   ArcNode *p;   printf("%3c",G.vertices[v].data);   visited[v]=1;   for(p=G.vertices[v].firstarc;p;p=p->nextarc)     if(!visited[p->adjvex])       DFS(G,p->adjvex); }  void DFSTraverse(ALGraph G) {//對用鄰接表存儲的無向圖G進行深度優先遍歷   int v;   for(v=0;v<G.vexnum;v++)     visited[v]=0;   for(v=0;v<G.vexnum;v++)     if(!visited[v])       DFS(G,v); }  void BFSTraverse(ALGraph G) {//對用鄰接表存儲的無向圖G進行深度優先遍歷   int u,v;   CqQueue Q;   ArcNode *p;   for(v=0;v<G.vexnum;v++)     visited[v]=0;   InitQueue(Q);   for(v=0;v<G.vexnum;v++)     if(!visited[v]){       printf("%3c",G.vertices[v].data);       visited[v]=1;       EnQueue(Q,v);       while(!QueueEmpty(Q)){         DeQueue(Q,u);         for(p=G.vertices[u].firstarc;p;p=p->nextarc)           if(!visited[p->adjvex]){             printf("%3c",G.vertices[p->adjvex].data);             visited[p->adjvex]=1;             EnQueue(Q,p->adjvex);           }       }     } }  int main(){   ALGraph G;   printf("建立無向圖的鄰接表:/n");   CreateAdjList(G);   printf("無向圖的深度優先遍歷序列如下:/n");   DFSTraverse(G);   printf("/n/n無向圖的廣度優先遍歷序列如下:/n");   BFSTraverse(G);   printf("/n");   return 0; } 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 达拉特旗| 浠水县| 盐亭县| 平利县| 金乡县| 黄平县| 内丘县| 拉孜县| 磐安县| 钦州市| 八宿县| 抚宁县| 浦城县| 新乡市| 卓资县| 韶山市| 英德市| 汶上县| 平泉县| 文水县| 桂平市| 南澳县| 大连市| 扎赉特旗| 上蔡县| 沐川县| 永德县| 台中县| 梅河口市| 德江县| 丰都县| 安康市| 老河口市| 山东| 密云县| 洛宁县| 威宁| 东辽县| 浦城县| 教育| 克什克腾旗|