C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之圖的遍歷實(shí)例詳解
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之圖的遍歷實(shí)例詳解
輸入一組頂點(diǎn),建立無(wú)向圖的鄰接矩陣。輸入一組頂點(diǎn),建立有向圖的鄰接表。分別對(duì)無(wú)向圖和有向圖進(jìn)行DFS(深度優(yōu)先遍歷)和BFS(廣度優(yōu)先遍歷)。寫出深度優(yōu)先遍歷的遞歸和非遞歸算法。根據(jù)建立的有向圖,判斷該圖是否是有向無(wú)環(huán)圖,若是,則輸出其一種拓?fù)溆行蛐蛄小?br />
實(shí)現(xiàn)代碼:
#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) {//初始化一個(gè)隊(duì)列 Q.base=(int*)malloc(MAX*sizeof(int)); Q.front=Q.rear=0; } int QueueEmpty(CqQueue Q) {//判斷隊(duì)列是否為空 if(Q.rear==Q.front) return 1; return 0; } void EnQueue(CqQueue &Q,int e) {//入隊(duì)操作 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) {//出隊(duì)操作 if(Q.rear==Q.front) return; e=Q.base[Q.front]; Q.front=(Q.front+1)%MAX; } int LocateVex(ALGraph G,char v) {//查找頂點(diǎn)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) {//建立無(wú)向圖的鄰接表 int v,i,j,k; char v1,v2; ArcNode *p,*s; printf("輸入無(wú)向圖的頂點(diǎn)數(shù)和邊數(shù):\n"); scanf("%d%d",&G.vexnum,&G.arcnum); getchar(); printf("輸入圖的頂點(diǎn)信息:\n"); for(v=0;v<G.vexnum;v++){ scanf("%c",&G.vertices[v].data);getchar(); G.vertices[v].firstarc=NULL; } printf("輸入無(wú)向圖的邊:\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) {//從頂點(diǎn)v開(kāi)始對(duì)圖G進(jìn)行深度優(yōu)先搜索 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) {//對(duì)用鄰接表存儲(chǔ)的無(wú)向圖G進(jìn)行深度優(yōu)先遍歷 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) {//對(duì)用鄰接表存儲(chǔ)的無(wú)向圖G進(jìn)行深度優(yōu)先遍歷 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("建立無(wú)向圖的鄰接表:\n"); CreateAdjList(G); printf("無(wú)向圖的深度優(yōu)先遍歷序列如下:\n"); DFSTraverse(G); printf("\n\n無(wú)向圖的廣度優(yōu)先遍歷序列如下:\n"); BFSTraverse(G); printf("\n"); return 0; }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
matlab鳥(niǎo)群算法求解車間調(diào)度問(wèn)題詳解及實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了matlab鳥(niǎo)群算法求解車間調(diào)度的問(wèn)題分析及實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程)
本文主要介紹了Vscode配置C/C++環(huán)境使用minGW(保姆級(jí)配置過(guò)程),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C利用語(yǔ)言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之隊(duì)列
隊(duì)列 (Queue):簡(jiǎn)稱隊(duì),是另一種限定性的線性表,它只允許在表的一端插入元素,而在另一端刪除元素。q=(a1, a2, a3, … an),其中a1為隊(duì)頭,an為隊(duì)尾,下面文章小編將為大家詳細(xì)介紹,需要的下伙伴可以參考一下2021-10-10C語(yǔ)言編程中對(duì)目錄進(jìn)行基本的打開(kāi)關(guān)閉和讀取操作詳解
這篇文章主要介紹了C語(yǔ)言編程中對(duì)目錄進(jìn)行基本的打開(kāi)關(guān)閉和讀取操作,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C語(yǔ)言實(shí)現(xiàn)經(jīng)典24點(diǎn)紙牌益智游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)經(jīng)典24點(diǎn)紙牌益智游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10