图的遍历DFS与BFS(邻接表)

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <queue>
#include <Windows.h>

using namespace std;

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20  //顶点最多个数
#define LENGTH 5           //顶点字符长度

//*********************************邻接表***********************************begin
typedef char VertexType[LENGTH];
typedef struct ArcNode
{
    int adjvex;
    struct ArcNode* nextarc;
    int weight;
}ArcNode;

typedef struct VNode
{
    VertexType data;
    ArcNode *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];

typedef struct
{
    AdjList vertices;
    int vexnum;
    int arcnum;
}ALGraph;

int LocateVex(const ALGraph & g, char name[LENGTH])
{
    for (int i = 0; i < g.vexnum; i++)
    {
        if (0 == strcmp(g.vertices[i].data, name))
        {
            return i;
        }
    }
    return -1;
}

//图的建造
void CreateGraph(ALGraph &g)
{
    ifstream fcin(_T("graph.txt"));
    fcin>>g.vexnum;
    
    for (int i = 0; i < g.vexnum; i++)
    {
        fcin>>g.vertices[i].data;
        g.vertices[i].firstarc = NULL;
    }
    fcin>>g.arcnum;
    char arcHead[LENGTH];
    char arcTail[LENGTH];
    int weight;
    ArcNode *p, *q;
    ArcNode *pTmp;
    for (int i = 0; i < g.arcnum; i++)
    {
        
        memset(arcHead, 0, LENGTH);
        memset(arcTail, 0, LENGTH);
        fcin>>arcTail>>arcHead>>weight;
        int x = LocateVex(g, arcHead);
        int y = LocateVex(g, arcTail);
        p = new ArcNode;
        q = new ArcNode;
        p->adjvex = y;
        p->nextarc = NULL;
        p->weight = weight;
        q->adjvex = x;
        q->nextarc = NULL;
        q->weight = weight;
        if (NULL == g.vertices[x].firstarc)
        { 
            g.vertices[x].firstarc = p;
        }
        else
        {
            for (pTmp = g.vertices[x].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc)
            {
                ;
            }
            pTmp->nextarc = p;
            
        }
        if (NULL == g.vertices[y].firstarc)
        { 
            g.vertices[y].firstarc = q;
        }
        else
        {
            for (pTmp = g.vertices[y].firstarc; NULL != pTmp->nextarc; pTmp = pTmp->nextarc)
            {
                ;
            }
            pTmp->nextarc = q;
        }
        /*p->adjvex = y;
        p->nextarc = g.vertices[x].firstarc;
        p->weight = weight;
        g.vertices[x].firstarc = p;

        q->adjvex = x;
        q->nextarc = g.vertices[y].firstarc;
        q->weight = weight;
        g.vertices[y].firstarc = q;*/
    }
}

//v的第一个邻接点
int FirstAdjVex(const ALGraph &g, int v)
{
    if ( NULL != g.vertices[v].firstarc)
    {
        return g.vertices[v].firstarc->adjvex;
    }
    return -1;
}

//v相对于w的下一个邻接点
int NextAdjVex(const ALGraph &g, int v, int w)
{
    ArcNode *p;
    for (p = g.vertices[v].firstarc; NULL != p; p = p->nextarc)
    {
        if (p->adjvex == w && p->nextarc != NULL)
        {
            return p->nextarc->adjvex;
        }
    }
    return -1;
}

//*********************************邻接表***********************************end

//深度优先遍历
bool visit[MAX_VERTEX_NUM];

void DFS (ALGraph& g, int v)
{
    visit[v] = true;
    cout<<g.vertices[v].data<<'\t';
    for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w))
    {
        if (!visit[w])
        {
            DFS(g, w);
        }
    }
}

void DFSTraverse(ALGraph &g)
{
    for (int v = 0; v < g.vexnum; v++)
    {
        visit[v] = false;
    }
    for (int v = 0; v < g.vexnum; v++)
    {
        if (!visit[v])
        {
            DFS(g, v);
        }
    }
    cout<<endl;
}

//广度优先遍历
void BFSTraverse(ALGraph &g, char vName[LENGTH])
{
    int pos = LocateVex(g, vName);
    for (int v = 0; v < g.vexnum; v++)
    {
        visit[v] = false;
    }
    queue<int> q;
    if (!visit[pos])
    {
        cout<<g.vertices[pos].data<<'\t';
        visit[pos] = true;
    }
    q.push(pos);
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w))
        {
            if (!visit[w])
            {
                cout<<g.vertices[w].data<<'\t';
                visit[w] = true;
                q.push(w);
            }
        }
    }
    cout<<endl;
}

//辅助函数,设置控制台的颜色
void SetConsoleTextColor(WORD dwColor)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    if (INVALID_HANDLE_VALUE == handle)
    {
        return;
    }
    SetConsoleTextAttribute(handle, dwColor);
}

int _tmain(int argc, _TCHAR* argv[])
{
    ALGraph graph;
    CreateGraph(graph);
    SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    cout<<"**************************DFS****************************"<<endl<<endl;
    DFSTraverse(graph);
    SetConsoleTextColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    cout<<"**************************BFS****************************"<<endl<<endl;
    BFSTraverse(graph, "V1");
    return 0;
}

界面运行如下:

建造图的graph.txt文本内容如下:

8
V1 V2 V3 V4 V5 V6 V7 V8 
10
V1 V2 10
V1 V3 50
V2 V4 30
V3 V5 40
V3 V6 99
V4 V5 2
V4 V7 60
V5 V7 80
V6 V8 22
V7 V8 70
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值