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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的邻接表存储与深度优先遍历代码实现

發(fā)布時(shí)間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的邻接表存储与深度优先遍历代码实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Graph.h
Vnode結(jié)構(gòu)成員firstarc在定義時(shí)賦初值NULL,在Visual Stdio 2013下編譯通過,VC6.0就不行(非靜態(tài)數(shù)據(jù)成員不能初始化)

#include <stdio.h> #include <stdlib.h>#define MAX_VERTEX_NUM 20typedef int InfoType, VertexType; //在這里可以設(shè)置頂點(diǎn)和弧數(shù)據(jù)類型 typedef struct ArcNode {int adjvex; //弧指向頂點(diǎn)的位置struct ArcNode *nextarc; //指向下一條弧的指針InfoType *info; //弧相關(guān)信息的指針 例如弧長(zhǎng)、權(quán)重等,這里用不到 }ArcNode; typedef struct VNode {VertexType data; //頂點(diǎn)信息ArcNode *firstarc = NULL; //指向第一條與該頂點(diǎn)相連的弧 }VNode, AdjList[MAX_VERTEX_NUM]; typedef struct {AdjList vertices; //每個(gè)圖類型中包含一個(gè)頂點(diǎn)數(shù)組int vexnum, arcnum; //圖的頂點(diǎn)數(shù)和弧數(shù)int kind; //圖的種類標(biāo)志 }ALGraph;void createG(ALGraph *G); void showG(ALGraph *G);void DFSTraverse(ALGraph G); void DFS(ALGraph G, int i, void(*visit) (VNode v)); inline void Print(VNode v) { printf("%d\n", v.data); } //訪問函數(shù)

Graph.cpp

#include "Graph.h"int vnum[MAX_VERTEX_NUM] = { false }; //vnum為訪問標(biāo)識(shí)數(shù)組void createG(ALGraph *G) //以鄰接表存儲(chǔ)方式創(chuàng)建圖 {//char TemData[64]; //暫時(shí)存儲(chǔ)頂點(diǎn)數(shù)據(jù)int i, j; //函數(shù)局部變量i,j用來記錄弧的頂點(diǎn)ArcNode *s; //新建的弧printf("請(qǐng)輸入頂點(diǎn)數(shù)和邊數(shù):\n");scanf("%d%d", &G->vexnum, &G->arcnum);for (int i = 0; i < G->vexnum; i++) //輸入頂點(diǎn)信息,這里可以用下標(biāo)唯一標(biāo)識(shí)每個(gè)頂點(diǎn){/*scanf("%s", TemData);G->vertices[i].data = (VertexType)TemData[64];*/G->vertices[i].data = (VertexType)i;}for (int k = 0; k < G->arcnum; k++){scanf("%d%d", &i, &j);s = (ArcNode *)malloc(sizeof(ArcNode)); //將s插入到i頂點(diǎn)的表頭s->adjvex = j;s->nextarc = G->vertices[i].firstarc;G->vertices[i].firstarc = s;s = (ArcNode *)malloc(sizeof(ArcNode)); //將s插入到j(luò)頂點(diǎn)的表頭s->adjvex = i;s->nextarc = G->vertices[j].firstarc;G->vertices[j].firstarc = s;} }void showG(ALGraph *G) //輸出表的信息 {ArcNode* Tem;for (int i = 0; i < G->vexnum; i++){printf("%d->", i);Tem = G->vertices[i].firstarc;while (Tem != NULL){printf("%d->", Tem->adjvex);Tem = Tem->nextarc;}printf("\n");} }void DFSTraverse(ALGraph G) { for (int i = 0; i < G.vexnum; i++)if (!vnum[i]) DFS(G, i, Print); }void DFS(ALGraph G, int i, void(*visit) (VNode v)) //對(duì)表G從頂點(diǎn)i開始做深度優(yōu)先遍歷 {vnum[i] = true; visit(G.vertices[i]);for (ArcNode *w = G.vertices[i].firstarc; w != NULL; w = w->nextarc)if (!vnum[w->adjvex]) DFS(G, w->adjvex, Print); }

main.cpp

#include "Graph.h" void main() {ALGraph G;createG(&G);showG(&G);DFSTraverse(G); }

總結(jié)

以上是生活随笔為你收集整理的图的邻接表存储与深度优先遍历代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。