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

来源:互联网 发布:淘宝备注在哪 编辑:程序博客网 时间:2024/06/05 17:51

Graph.h
Vnode结构成员firstarc在定义时赋初值NULL,在Visual Stdio 2013下编译通过,VC6.0就不行(非静态数据成员不能初始化)

#include <stdio.h>#include <stdlib.h>#define MAX_VERTEX_NUM 20typedef 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);}

这里写图片描述

1 0
原创粉丝点击