数据结构之图的创建(邻接表)

数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解。邻接无向图1.邻接表无向图介绍邻接表无向图是指通过邻接表表示的无向图。上面的图G1包含了"A,B,C,D,

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

  数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解。

邻接无向图

1. 邻接表无向图介绍

  邻接表无向图是指通过邻接表表示的无向图。

数据结构之图的创建(邻接表)

  上面的图G1包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)”共7条边。

  上图右边的矩阵是G1在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了”该顶点的邻接点的序号”。例如,第2个顶点(顶点C)包含的链表所包含的节点的数据分别是”0,1,3″;而这”0,1,3″分别对应”A,B,D”的序号,”A,B,D”都是C的邻接点。就是通过这种方式记录图的信息的。

2. 邻接表无向图代码实现

(1)数据结构

struct ENode
{
    int nVindex;  // 该边所指的顶点的位置
    ENode *pNext; // 指向下一个边的指针
};

struct VNode
{
    char data;  // 顶点信息
    ENode *pFirstEdge; // 指向第一条依附该顶点的边
};

(2)图的创建

listUDG(char *vexs, int vlen, char edges[][2], int elen)
{
    m_nVexNum = vlen;
    m_nEdgNum = elen;

    // 初始化"邻接表"的顶点
    for (int i = 0; i < vlen; i ++)
    {
        m_mVexs[i].data = vexs[i];
        m_mVexs[i].pFirstEdge = NULL;
    }

    char c1,c2;
    int p1,p2;
    ENode *node1, *node2;
    // 初始化"邻接表"的边
    for (int j = 0; j < elen; j ++)
    {
        // 读取边的起始顶点和结束顶点
        c1 = edges[j][0];
        c2 = edges[j][1];
        p1 = GetVIndex(c1);
        p2 = GetVIndex(c2);

        node1 = new ENode();
        node1->nVindex = p2;
        if (m_mVexs[p1].pFirstEdge == NULL)
        {
            m_mVexs[p1].pFirstEdge = node1;
        }
        else
        {
            LinkLast(m_mVexs[p1].pFirstEdge, node1);
        }

        node2 = new ENode();
        node2->nVindex = p1;
        if (m_mVexs[p2].pFirstEdge == NULL)
        {
            m_mVexs[p2].pFirstEdge = node2;
        }
        else
        {
            LinkLast(m_mVexs[p2].pFirstEdge, node2);
        }
    }

}

(3)完整代码

数据结构之图的创建(邻接表)
数据结构之图的创建(邻接表)

#include "stdio.h"
#include <iostream>
using namespace std;

#define MAX 100

//
struct ENode
{
    int nVindex;  // 该边所指的顶点的位置
    ENode *pNext; // 指向下一个边的指针
};

struct VNode
{
    char data;  // 顶点信息
    ENode *pFirstEdge; // 指向第一条依附该顶点的边
};

// 无向邻接表
class listUDG
{
public:
    listUDG(){};
    listUDG(char *vexs, int vlen, char edges[][2], int elen)
    {
        m_nVexNum = vlen;
        m_nEdgNum = elen;

        // 初始化"邻接表"的顶点
        for (int i = 0; i < vlen; i ++)
        {
            m_mVexs[i].data = vexs[i];
            m_mVexs[i].pFirstEdge = NULL;
        }

        char c1,c2;
        int p1,p2;
        ENode *node1, *node2;
        // 初始化"邻接表"的边
        for (int j = 0; j < elen; j ++)
        {
            // 读取边的起始顶点和结束顶点
            c1 = edges[j][0];
            c2 = edges[j][1];
            p1 = GetVIndex(c1);
            p2 = GetVIndex(c2);

            node1 = new ENode();
            node1->nVindex = p2;
            if (m_mVexs[p1].pFirstEdge == NULL)
            {
                m_mVexs[p1].pFirstEdge = node1;
            }
            else
            {
                LinkLast(m_mVexs[p1].pFirstEdge, node1);
            }

            node2 = new ENode();
            node2->nVindex = p1;
            if (m_mVexs[p2].pFirstEdge == NULL)
            {
                m_mVexs[p2].pFirstEdge = node2;
            }
            else
            {
                LinkLast(m_mVexs[p2].pFirstEdge, node2);
            }
        }

    }
    ~listUDG()
    {
        ENode *pENode = NULL;
        ENode *pTemp = NULL;
        for (int i = 0; i < m_nVexNum; i ++)
        {
            pENode = m_mVexs[i].pFirstEdge;
            if (pENode != NULL)
            {
                pTemp = pENode;
                pENode = pENode->pNext;

                delete pTemp;
            }
            delete pENode;
        }
    }

    void PrintUDG()
    { 
        ENode *pTempNode = NULL;
        cout << "邻接无向表:" << endl;
        for (int i = 0; i < m_nVexNum; i ++)
        {
            cout << "顶点:" << GetVIndex(m_mVexs[i].data)<< "-" << m_mVexs[i].data<<  "->";
            pTempNode = m_mVexs[i].pFirstEdge;
            while (pTempNode)
            {
                cout <<pTempNode->nVindex << "->";
                pTempNode = pTempNode->pNext;
            }
            cout << endl;
        }
    }
private:
    // 返回顶点的索引
    int GetVIndex(char ch)
    {
        int i = 0;
        for (; i < m_nVexNum; i ++)
        {
            if (m_mVexs[i].data == ch)
            {
                return i;
            }
        }
        return -1;
    }

    void LinkLast(ENode *pFirstNode, ENode *pNode)
    {
        if (pFirstNode == NULL || pNode == NULL)
        {
            return;
        }
        ENode *pTempNode = pFirstNode;
        while (pTempNode->pNext != NULL)
        {
            pTempNode = pTempNode->pNext;
        }

        pTempNode->pNext = pNode;
    }

private:
    int m_nVexNum;   // 顶点数目
    int m_nEdgNum;   // 边数目
    VNode m_mVexs[MAX];
};

void main()
{
    char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
    char edges[][2] = { 
        {'A', 'C'},  
        {'A', 'D'},  
        {'A', 'F'},  
        {'B', 'C'},  
        {'C', 'D'},  
        {'E', 'G'},  
        {'F', 'G'}}; 
    int vlen = sizeof(vexs)/sizeof(vexs[0]); 
    int elen = sizeof(edges)/sizeof(edges[0]); 
    listUDG* pG = new listUDG(vexs, vlen, edges, elen); 

    pG->PrintUDG();   // 打印图 

    return; 
}

View Code

数据结构之图的创建(邻接表)

邻接有向图

1. 邻接表有向图介绍

  邻接表有向图是指通过邻接表表示的有向图。

数据结构之图的创建(邻接表)

  上面的图G2包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”<A,B>,<B,C>,<B,E>,<B,F>,<C,E>,<D,C>,<E,B>,<E,D>,<F,G>”共9条边。

上  图右边的矩阵是G2在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了”该顶点所对应的出边的另一个顶点的序号”。例如,第1个顶点(顶点B)包含的链表所包含的节点的数据分别是”2,4,5″;而这”2,4,5″分别对应”C,E,F”的序号,”C,E,F”都属于B的出边的另一个顶点。

2. 邻接表有向图代码实现

(1)数据结构

struct ENode
{
    int nVindex;  // 该边所指的顶点的位置
    ENode *pNext; // 指向下一个边的指针
};

struct VNode
{
    char data;  // 顶点信息
    ENode *pFirstEdge; // 指向第一条依附该顶点的边
};

(2)邻接表有向图创建

listDG(char *vexs, int vlen, char edges[][2], int elen)
{
    m_nVexNum = vlen;
    m_nEdgNum = elen;

    // 初始化"邻接表"的顶点
    for (int i = 0; i < vlen; i ++)
    {
        m_mVexs[i].data = vexs[i];
        m_mVexs[i].pFirstEdge = NULL;
    }

    char c1,c2;
    int p1,p2;
    ENode *node1;
    // 初始化"邻接表"的边
    for (int j = 0; j < elen; j ++)
    {
        // 读取边的起始顶点和结束顶点
        c1 = edges[j][0];
        c2 = edges[j][1];
        p1 = GetVIndex(c1);
        p2 = GetVIndex(c2);

        node1 = new ENode();
        node1->nVindex = p2;
        if (m_mVexs[p1].pFirstEdge == NULL)
        {
            m_mVexs[p1].pFirstEdge = node1;
        }
        else
        {
            LinkLast(m_mVexs[p1].pFirstEdge, node1);
        }
    }
}

(3)完整代码实现

数据结构之图的创建(邻接表)
数据结构之图的创建(邻接表)

#include "stdio.h"
#include <iostream>
using namespace std;

#define MAX 100

//
struct ENode
{
    int nVindex;  // 该边所指的顶点的位置
    ENode *pNext; // 指向下一个边的指针
};

struct VNode
{
    char data;  // 顶点信息
    ENode *pFirstEdge; // 指向第一条依附该顶点的边
};

// 有向邻接表
class listDG
{
public:
    listDG(){};
    listDG(char *vexs, int vlen, char edges[][2], int elen)
    {
        m_nVexNum = vlen;
        m_nEdgNum = elen;

        // 初始化"邻接表"的顶点
        for (int i = 0; i < vlen; i ++)
        {
            m_mVexs[i].data = vexs[i];
            m_mVexs[i].pFirstEdge = NULL;
        }

        char c1,c2;
        int p1,p2;
        ENode *node1;
        // 初始化"邻接表"的边
        for (int j = 0; j < elen; j ++)
        {
            // 读取边的起始顶点和结束顶点
            c1 = edges[j][0];
            c2 = edges[j][1];
            p1 = GetVIndex(c1);
            p2 = GetVIndex(c2);

            node1 = new ENode();
            node1->nVindex = p2;
            if (m_mVexs[p1].pFirstEdge == NULL)
            {
                m_mVexs[p1].pFirstEdge = node1;
            }
            else
            {
                LinkLast(m_mVexs[p1].pFirstEdge, node1);
            }
        }
    }
    ~listDG()
    {
        ENode *pENode = NULL;
        ENode *pTemp = NULL;
        for (int i = 0; i < m_nVexNum; i ++)
        {
            pENode = m_mVexs[i].pFirstEdge;
            if (pENode != NULL)
            {
                pTemp = pENode;
                pENode = pENode->pNext;

                delete pTemp;
            }
            delete pENode;
        }
    }

    void PrintDG()
    { 
        ENode *pTempNode = NULL;
        cout << "邻接有向表:" << endl;
        for (int i = 0; i < m_nVexNum; i ++)
        {
            cout << "顶点:" << GetVIndex(m_mVexs[i].data)<< "-" << m_mVexs[i].data<<  "->";
            pTempNode = m_mVexs[i].pFirstEdge;
            while (pTempNode)
            {
                cout <<pTempNode->nVindex << "->";
                pTempNode = pTempNode->pNext;
            }
            cout << endl;
        }
    }
private:
    // 返回顶点的索引
    int GetVIndex(char ch)
    {
        int i = 0;
        for (; i < m_nVexNum; i ++)
        {
            if (m_mVexs[i].data == ch)
            {
                return i;
            }
        }
        return -1;
    }

    void LinkLast(ENode *pFirstNode, ENode *pNode)
    {
        if (pFirstNode == NULL || pNode == NULL)
        {
            return;
        }
        ENode *pTempNode = pFirstNode;
        while (pTempNode->pNext != NULL)
        {
            pTempNode = pTempNode->pNext;
        }

        pTempNode->pNext = pNode;
    }

private:
    int m_nVexNum;   // 顶点数目
    int m_nEdgNum;   // 边数目
    VNode m_mVexs[MAX];
};

void main()
{
    char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'}; 
    char edges[][2] = { 
        {'A', 'B'},  
        {'B', 'C'},  
        {'B', 'E'},  
        {'B', 'F'},  
        {'C', 'E'},  
        {'D', 'C'},  
        {'E', 'B'},  
        {'E', 'D'},  
        {'F', 'G'}};  
    int vlen = sizeof(vexs)/sizeof(vexs[0]); 
    int elen = sizeof(edges)/sizeof(edges[0]); 

    listDG *pG = new listDG(vexs, vlen, edges, elen); 

    pG->PrintDG();   // 打印图 

    return; 
}

View Code

数据结构之图的创建(邻接表)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120150.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    2021年11月19日
    22
  • vue上传文件组件使用_uniapp支持ios文件上传

    vue上传文件组件使用_uniapp支持ios文件上传imgList:[],size:0,limit:undefined}},methods:{//设置fileClick(){document.getElementById(‘upload_file’).click()},fileChange(el){if(!el.target.files[0].size)returnthis.fileList(el.target)el.target.value=‘’},fileList(fileList){letfil

    2022年8月15日
    3
  • msfconsole爆破ftp_check point防火墙

    msfconsole爆破ftp_check point防火墙Msfconsole爆破ssh一:什么是sshSsh为linux系统下的远程登录命令。好比windows下的远程桌面。登录ssh后可以对服务器进行相关的操作!二:端口扫描目标发现1:用namp或者netcat扫描网络,发现我的路由器是开启了ssh服务2:用netcap扫描三:msfconsole激活成功教程密码1:msfconsole运行…

    2025年9月5日
    9
  • Vue里this指向

    Vue里this指向一 普通函数中的 this nbsp 这是 vue 文档里的原话 All nbsp lifecycle nbsp hooks nbsp are nbsp called nbsp with nbsp their nbsp this nbsp context nbsp pointing nbsp to nbsp the nbsp Vue nbsp instance nbsp invoking nbsp it 意思是 在 Vue 所有的生命周期钩子方法 如 created mounted nbsp updated 以及 destroyed 里使用 this this 指向调用它的 Vu

    2026年1月23日
    1
  • ios-ScrollView添加到view上,view的touchesBegan无法执行

    ios-ScrollView添加到view上,view的touchesBegan无法执行这几天做的时候碰到了这么个问题,就是当我们把ScrollView添加到控制器的view上,或者添加到UICollectionViewCell上面,scrollView的父视图的touchesBegan都无法响应。而当我们把scrollView的userInteractionEnabled改成false的时候,父视图的touchesBegan就可以执行。这里记录下。有可能是因为ScrollVie

    2022年7月25日
    13
  • UART通信接口_uart接口程序

    UART通信接口_uart接口程序

    2025年11月15日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号