不同的存储结构所采用的实现方法有所区别,这里优先理解思想
后续会更新具体实现图以及实现方法
以下是实现代码
#include<stdio.h> #define NumOfVertex 200 #define VertexType int int visited[NumOfVertex]; typedef enum{Digraph,Undigraph,DirectedNet,UndirectedNet}GraphKind; typedef struct{ int relation; //无权图用01表示是否相连接 网直接表示权重 //Info; }rlt,rltionMatrix[NumOfVertex][NumOfVertex]; typedef struct{ VertexType Vex[NumOfVertex]; //存顶点 int NumOfVex,NumOfArc; //存顶点和边的数量 rltionMatrix Matrix; // 矩阵 GraphKind kind; //图的类型 }MyGraph; //定位顶点在表中位置 int LocateVex(MyGraph*g,VertexType v){ for(int i = 0;i<g->NumOfVex;i++){ if(g->Vex[i]==v) return i; } printf("None"); return -1; } //创建有向图 void CreatDG(MyGraph *g){ int VNum,ANum; scanf("%d %d",&(g->NumOfVex),&(g->NumOfArc)); //存顶点数据 for(int i =0;i<g->NumOfVex;i++) scanf("%d",&(g->Vex[i])); //printf("RUN HERE"); //初始化矩阵全置为0 for(int i =0;i<g->NumOfVex;i++) for(int j = 0;j<g->NumOfVex;j++) { g->Matrix[i][j].relation=0; //info } //构造矩阵 for(int i = 0;i<g->NumOfArc;i++) { int v1,v2; scanf("%d %d", &v1, &v2); int pos1 = LocateVex(g,v1); int pos2 = LocateVex(g,v2); if(pos1==-1||pos2==-1) return; else g->Matrix[pos1][pos2].relation=1; ////无向图的二阶矩阵沿主对角线对称 //网读入权存入矩阵 } } //void CreateGraph(MyGraph* G) { // //选择图的类型 // scanf("%d", &(G->kind)); // //根据所选类型,调用不同的函数实现构造图的功能 // switch (G->kind) { // case DG: // return CreateDG(G); // break; // case DN: // return CreateDN(G); // break; // case UDG: // return CreateUDG(G); // break; // case UDN: // return CreateUDN(G); // break; // default: // break; // } //} void printG(MyGraph *g){ for (int i = 0;i<g->NumOfVex;i++){ for(int j = 0;j<g->NumOfVex;j++) { printf(" %d ",g->Matrix[i][j].relation); } printf("\n"); } } //DFS int FindFirstAdjVex(MyGraph *g,int v){ //寻找第一个相邻结点 for(int i = 0;i<g->NumOfVex;i++){ if(g->Matrix[v][i].relation){ return i; } } return -1; //未找到返回-1 } int FineNext(MyGraph *g,int v,int now) //对于数组下标 v 处的顶点,从 now 位置开始继续查找和它相邻的顶点,并返回该顶点的数组下标 { for(int i = now+1;i<g->NumOfVex;i++){ if(g->Matrix[v][i].relation){ return i; } } return -1; } void DFS(MyGraph g,VertexType v){ int i ; printf("%d ",g.Vex[v]); visited[v] = 1; for(i = FindFirstAdjVex(&g,v);i>=0;i = FineNext(&g,v,i)) { if(!visited[i]) DFS(g,i); } //简写 //for(int j = 0;j<g.NumOfVex;j++){ // if(g.Matrix[v][j].relation==1&&!visited[j]) // DFS(g,j); //} } void DFSTraverse(MyGraph g){ for(int i= 0;i<g.NumOfVex;i++) visited[i] = 0; for(int i= 0;i<g.NumOfVex;i++) { if(!visited[i]) DFS(g,i); } } int main(){ MyGraph g; CreatDG(&g); printG(&g); DFSTraverse(g); }
标签:MyGraph,return,int,DFS,iNumOfVex,++,relation,顺序存储,结构 From: https://www.cnblogs.com/konataxzy/p/16897134.html