Graph.h
Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化)
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef int InfoType, VertexType; //在这里可以设置顶点和弧数据类型
typedef struct ArcNode
{
int adjvex; //弧指向顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //弧相关信息的指针 例如弧长、权重等,这里用不到
}ArcNode;
typedef struct VNode
{
VertexType data; //顶点信息
ArcNode *firstarc = NULL; //指向第一条与该顶点相连的弧
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices; //每个图类型中包含一个顶点数组
int vexnum, arcnum; //图的顶点数和弧数
int kind; //图的种类标志
}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); } //访问函数
Graph.cpp
#include "Graph.h"
int vnum[MAX_VERTEX_NUM] = { false }; //vnum为访问标识数组
void createG(ALGraph *G) //以邻接表存储方式创建图
{
//char TemData[64]; //暂时存储顶点数据
int i, j; //函数局部变量i,j用来记录弧的顶点
ArcNode *s; //新建的弧
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
for (int i = 0; i < G->vexnum; i++) //输入顶点信息,这里可以用下标唯一标识每个顶点
{
/*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顶点的表头
s->adjvex = j;
s->nextarc = G->vertices[i].firstarc;
G->vertices[i].firstarc = s;
s = (ArcNode *)malloc(sizeof(ArcNode)); //将s插入到j顶点的表头
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)) //对表G从顶点i开始做深度优先遍历
{
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);
}