#define MAXVEX 100 #define true 1 typedef char VertexType; //定义图节点值得类型,可随意更换 typedef int EdgeType; typedef struct EdgeNode //定义边表节点 { int adjvex; //存储顶点下标 EdgeType weight; //权重值 struct EdgeNode* next; //边指针 }EdgeNode; typedef struct VertexNode /*顶点表节点*/ { VertexType data; EdgeNode* firstedge; }VertexNode,AdjList[MAXVEX]; typedef struct { AdjList adjList; int numVertexes,numEdges; }GraphAdjList;
void CreatGraph(GraphAdjList *g) { int i,j,k; EdgeNode *e; scanf("%d%d",&g->numVertexes,&g->numEdges);//获取顶点数和边数 char c; //gettchar(); for(i=0;i<g->numVertexes;i++) { while((c=getchar())=='\n'||c==' ');//排除空格和换行符 g->adjList[i].data = c; //获取顶点值, g->adjList[i].firstedge = NULL; //将边表置为空 } for(k=0;k<g->numEdges;k++) { scanf("%d%d",&i,&j); //输入i,j 在图中有i-->j e=(EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = g->adjList[i].firstedge; //头插法创建边表 g->adjList[i].firstedge= e; /*若是为无向图,则加入如下代码 e=(EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = g->adjList[j].firstedge; g->adjList[j].firstedge= e;*/ } }
void DFS(GraphAdjList *g,int i) { EdgeNode *p; visited[i]=true; printf("%c ",g->adjList[i].data); p = g->adjList[i].firstedge; while(p) { if(visited[p->adjvex]==0) DFS(g,p->adjvex); p=p->next; } }
假设有下面这张图,这个图包含两个连通图。git
输入以下:github
7 6 <==输入顶点数和边数 a b c d e f g <==输入顶点值 0 2 0 3 0 1 4 5 1 6 1 2 <==依次输入边
根据输入,能够获得邻接表以下:
根据邻接表可知,该图的深度优先遍历以下:指针
a->b->c->g->d->e->f
程序运行结果:
证实程序是正确的。
完整程序代码参见:
https://github.com/zkangHUST/DataStructurecode