无向图邻接表的深度优先遍历(DFS)

 邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n个顶点建立n个单链表)

 

头文件:Graph.h

#ifndef GRAPH_H
#define GRAPH_H
#define MAXSIZE 50
typedef char VertexType;  //顶点数据类型
typedef int EdgeType; //边权值类型
typedef struct edgenode{
    int adjvex;				//当前节点的下标值
    EdgeType weight;		//边的权值
    struct edgenode* next;  //边表的域,指向下一个边表节点
}EdgeNode;
typedef struct vertexnode{
    VertexType data;        //顶点的数据
    EdgeNode *pAdjNext;     //顶点的域,指向边表节点
}VertexNode,Vertex[MAXSIZE];
typedef struct graph{
    Vertex Vertexes;   //顶点节点
    int NumVertexes,NumEdges;
}Graph;
void CreateGraph(Graph *G);  //创建图
void DFS(Graph *G,int i);   //深度优先遍历算法
void DFSTraverse(Graph *G); //以深度优先遍历算法遍历图
#endif //GRAPH_H

实现文件:Graph.cpp

#include "Graph.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
bool visited[MAXSIZE];
void CreateGraph(Graph *G)
{
    EdgeNode *e = NULL;
    printf("请输入图的顶点数和边数:\n");
    scanf("%d%d",&G->NumVertexes,&G->NumEdges);
    printf("请输入图的顶点信息:\n");
    for(int i = 0;i < G->NumVertexes;++i)
    {
        fflush(stdin);	
        scanf("%c",&G->Vertexes[i].data);
        G->Vertexes[i].pAdjNext = NULL;
    }
    for(int k = 0;k < G->NumEdges;++k)
    {
        int i,j,w;
        e = (EdgeNode*)malloc(sizeof(EdgeNode));
        if(!e)
            exit(OVERFLOW);
        printf("请输入边的链接信息(vi,vj)及权值:\n");
        fflush(stdin);
        scanf("%d%d%d",&i,&j,&w);
        e->adjvex = j;
        e->weight = w;
        e->next = G->Vertexes[i].pAdjNext; //建立链表
        G->Vertexes[i].pAdjNext = e;
        //由于是无向图,存在反向链接
        e = (EdgeNode*)malloc(sizeof(EdgeNode));
        if(!e)
            exit(OVERFLOW);
        e->adjvex = i;
        e->weight = w;
        e->next = G->Vertexes[j].pAdjNext;
        G->Vertexes[j].pAdjNext = e;
    }
}
void DFSTraverse(Graph *G)
{
    for(int i = 0;i < G->NumVertexes;++i) //初始化图的各个顶点为false,未访问过
        visited[i] = false;
    for(int i = 0;i < G->NumVertexes;++i) 
        if(!visited[i])   //选取一个未访问过的顶点进行深度优先遍历,如果是连通图DFS只执行一次
            DFS(G,i);
}
void DFS(Graph *G,int i)
{
    visited[i] = true;
    printf("%c ",G->Vertexes[i].data);
    EdgeNode *p = G->Vertexes[i].pAdjNext; 
    while(p)
    {
        if(!visited[p->adjvex]) //如果边表结点没有被访问过,则递归调用DFS
            DFS(G,p->adjvex);
        p = p->next;
    }
}

测试文件main.cpp

#include "Graph.h"
int main()
{
    Graph G;
    CreateGraph(&G);
    DFSTraverse(&G);
    return 0;
}

 

 

 

 

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/flying0033/article/details/6971916
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞