图的深度优先遍历

图的遍历主要有两种方式:深度优先遍历(Depth_First_Search)深度优先遍历和广度优先遍历(Breadth_First_Search)。图的深度优先遍历类似于树的先序遍历,图的广度优先遍历类似于树的层次遍历。

这里用图的深度优先遍历实现图的遍历(基于无向无权图的邻接表存储结构)

#pragma once
#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define Max_size 10
#define T char

typedef struct Edges
{
    int dex;//顶点的下标
    struct Edges *link;//指向下一条边的指针
}Edges;

typedef struct Vertex
{
    T data;//顶点数据
    Edges *adj;//顶点指向边的指针
}Vertex;

typedef struct Graph_table
{
    int MaxVertices;//最大容量
    int NmuVertices; //顶点数
    int NumEdges;    //边数
    Vertex *NnodeTable;//顶点的结构的表,
}Graph_table;

void InitGraph(Graph_table *gt)
{
    gt->MaxVertices = Max_size;
    gt->NmuVertices = gt->NumEdges = 0;
    gt->NnodeTable = (Vertex*)malloc(sizeof(Vertex)*(gt->MaxVertices));
    assert(NULL != gt->NnodeTable);
    for(int i= 0;i<gt->MaxVertices;++i)
    {
        gt->NnodeTable[i].adj = NULL;
    }
}

void InsertVertex(Graph_table *gt,T x)//

{

    if(gt->NmuVertices >= gt->MaxVertices)
        return;
    gt->NnodeTable[gt->NmuVertices++].data = x;
}

void Show(Graph_table *gt)
{
    Edges *p;
    for(int i=0;i<gt->NmuVertices;++i)
    {
        printf("%d , %c : ",i,gt->NnodeTable[i].data);
        p = gt->NnodeTable[i].adj;
        while(NULL != p)
        {
            printf("%d --> ",p->dex);
            p = p->link;
        }
        printf("NULL.\n");
    }
    printf("\n");
}

int Getpos(Graph_table *gt,T x)    //获取顶点的位置
{
    for(int i= 0;i<gt->NmuVertices;++i)
    {
        if(gt->NnodeTable[i].data == x)
            return i;
    }
    return -1;  //顶点在表里不存在
}

void InsertEdge(Graph_table *gt,T x,T y)  //插入边
{
    int p1 = Getpos(gt,x);
    int p2 = Getpos(gt,y);
    if(p1==-1 || p2==-1)
        return;
    Edges *s;
    s = (Edges *)malloc(sizeof(Edges));//开辟边结点
    assert(s != NULL);
    s->dex = p2;      //x-->y  xy的边
    s->link = gt->NnodeTable[p1].adj;
    gt->NnodeTable[p1].adj = s;

    s = (Edges *)malloc(sizeof(Edges));//开辟边结点
    assert(s != NULL);
    s->dex = p1;      //y-->x yx的边
    s->link = gt->NnodeTable[p2].adj;
    gt->NnodeTable[p2].adj = s;

    gt->NumEdges++;
}

typedef int Boolean;
Boolean visited[Max_size];
void DFS(Graph_table *gt,int i)  //邻接表的深度优先递归算法
{
    Edges *p;
    visited[i] = true;
    printf("%c ",gt->NnodeTable[i].data);
    p = gt->NnodeTable[i].adj;
    while(p)
    {
        if(!visited[p->dex])
            DFS(gt,p->dex);
        p = p->link;
    }
}

void DFSvisit(Graph_table *gt)  //邻接表的深度遍历
{
    int i;
    for(i=0;i<gt->NmuVertices;++i)
    {
        visited[i] = false;
    }
    for(i=0;i<gt->NmuVertices;++i)
    {
        if(!visited[i])
            DFS(gt,i);
    }
}


测试文件
#include"Graph_DFS.h"

void main()
{
    Graph_table gt;   //邻接表的对象
    InitGraph(&gt);    //邻接表的初始化
    InsertVertex(&gt,'A');//图的顶点的插入
    InsertVertex(&gt,'B');
    InsertVertex(&gt,'C');
    InsertVertex(&gt,'D');
    InsertVertex(&gt,'E');
    Show(&gt);

    InsertEdge(&gt,'A','B');//图的边的插入
    InsertEdge(&gt,'A','D');
    InsertEdge(&gt,'B','C');
    InsertEdge(&gt,'B','E');
    InsertEdge(&gt,'C','D');
    InsertEdge(&gt,'C','E');
    Show(&gt);

    DFSvisit(&gt);//图的深度优先遍历
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值