`
wbj0110
  • 浏览: 1571030 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

邻接表无向图--- C++

阅读更多

邻接表无向图的介绍

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

上面的图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的邻接点。就是通过这种方式记录图的信息的。

邻接表无向图的代码说明

1. 基本定义

复制代码
#define MAX 100
// 邻接表
class ListUDG
{
    private: // 内部类
        // 邻接表中表对应的链表的顶点
        class ENode
        {
            public:
                int ivex;           // 该边所指向的顶点的位置
                ENode *nextEdge;    // 指向下一条弧的指针
        };

        // 邻接表中表的顶点
        class VNode
        {
            public:
                char data;          // 顶点信息
                ENode *firstEdge;   // 指向第一条依附该顶点的弧
        };

    private: // 私有成员
        int mVexNum;             // 图的顶点的数目
        int mEdgNum;             // 图的边的数目
        VNode mVexs[MAX];

    public:
        // 创建邻接表对应的图(自己输入)
        ListUDG();
        // 创建邻接表对应的图(用已提供的数据)
        ListUDG(char vexs[], int vlen, char edges[][2], int elen);
        ~ListUDG();

        // 打印邻接表图
        void print();

    private:
        // 读取一个输入字符
        char readChar();
        // 返回ch的位置
        int getPosition(char ch);
        // 将node节点链接到list的最后
        void linkLast(ENode *list, ENode *node);
};
复制代码

(01) ListUDG是邻接表对应的结构体。 
mVexNum是顶点数,mEdgNum是边数;mVexs则是保存顶点信息的一维数组。

(02) VNode是邻接表顶点对应的结构体。 
data是顶点所包含的数据,而firstEdge是该顶点所包含链表的表头指针。

(03) ENode是邻接表顶点所包含的链表的节点对应的结构体。 
ivex是该节点所对应的顶点在vexs中的索引,而nextEdge是指向下一个节点的。

2. 创建矩阵

这里介绍提供了两个创建矩阵的方法。一个是用已知数据,另一个则需要用户手动输入数据

2.1 创建图(用已提供的矩阵)

复制代码
/*
 * 创建邻接表对应的图(用已提供的数据)
 */
ListUDG::ListUDG(char vexs[], int vlen, char edges[][2], int elen)
{
    char c1, c2;
    int i, p1, p2;
    ENode *node1, *node2;

    // 初始化"顶点数"和"边数"
    mVexNum = vlen;
    mEdgNum = elen;
    // 初始化"邻接表"的顶点
    for(i=0; i<mVexNum; i++)
    {
        mVexs[i].data = vexs[i];
        mVexs[i].firstEdge = NULL;
    }

    // 初始化"邻接表"的边
    for(i=0; i<mEdgNum; i++)
    {
        // 读取边的起始顶点和结束顶点
        c1 = edges[i][0];
        c2 = edges[i][1];

        p1 = getPosition(c1);
        p2 = getPosition(c2);
        // 初始化node1
        node1 = new ENode();
        node1->ivex = p2;
        // 将node1链接到"p1所在链表的末尾"
        if(mVexs[p1].firstEdge == NULL)
          mVexs[p1].firstEdge = node1;
        else
            linkLast(mVexs[p1].firstEdge, node1);
        // 初始化node2
        node2 = new ENode();
        node2->ivex = p1;
        // 将node2链接到"p2所在链表的末尾"
        if(mVexs[p2].firstEdge == NULL)
          mVexs[p2].firstEdge = node2;
        else
            linkLast(mVexs[p2].firstEdge, node2);
    }
}
复制代码

该函数的作用是创建一个邻接表无向图。实际上,该方法创建的无向图,就是上面图G1。调用代码如下:

复制代码
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;

pG = new ListUDG(vexs, vlen, edges, elen);
复制代码

2.2 创建图(自己输入)

复制代码
/*
 * 创建邻接表对应的图(自己输入)
 */
ListUDG::ListUDG()
{
    char c1, c2;
    int v, e;
    int i, p1, p2;
    ENode *node1, *node2;

    // 输入"顶点数"和"边数"
    cout << "input vertex number: ";
    cin >> mVexNum;
    cout << "input edge number: ";
    cin >> mEdgNum;
    if ( mVexNum < 1 || mEdgNum < 1 || (mEdgNum > (mVexNum * (mVexNum-1))))
    {
        cout << "input error: invalid parameters!" << endl;
        return ;
    }

    // 初始化"邻接表"的顶点
    for(i=0; i<mVexNum; i++)
    {
        cout << "vertex(" << i << "): ";
        mVexs[i].data = readChar();
        mVexs[i].firstEdge = NULL;
    }

    // 初始化"邻接表"的边
    for(i=0; i<mEdgNum; i++)
    {
        // 读取边的起始顶点和结束顶点
        cout << "edge(" << i << "): ";
        c1 = readChar();
        c2 = readChar();

        p1 = getPosition(c1);
        p2 = getPosition(c2);
        // 初始化node1
        node1 = new ENode();
        node1->ivex = p2;
        // 将node1链接到"p1所在链表的末尾"
        if(mVexs[p1].firstEdge == NULL)
          mVexs[p1].firstEdge = node1;
        else
            linkLast(mVexs[p1].firstEdge, node1);
        // 初始化node2
        node2 = new ENode();
        node2->ivex = p1;
        // 将node2链接到"p2所在链表的末尾"
        if(mVexs[p2].firstEdge == NULL)
          mVexs[p2].firstEdge = node2;
        else
            linkLast(mVexs[p2].firstEdge, node2);
    }
}
复制代码

该函数是读取用户的输入,将输入的数据转换成对应的无向图

源码:https://github.com/wangkuiwu/datastructs_and_algorithm/blob/master/source/graph/basic/udg/cplus/ListUDG.cpp

http://www.cnblogs.com/skywang12345/p/3707610.html

 

 

分享到:
评论

相关推荐

    数据库课程设计(无向图邻接矩阵存储+邻接表和约瑟夫环的模拟) MFC

    通过阅读和分析这些材料,可以深入理解无向图的邻接矩阵和邻接表表示,以及约瑟夫环问题的编程实现,同时还能了解到如何使用MFC构建GUI应用程序。 总之,这个数据库课程设计涵盖了数据结构中的核心概念,包括无向图...

    图的邻接表实现.rar

    本项目提供了一个C++实现的邻接表,能够处理有向图和无向图,并且使用了类模板来增强代码的通用性。以下是对这个项目的详细解释: 首先,邻接表是一种存储图的有效方式,尤其适用于稀疏图(即边的数量远小于顶点...

    无向图的邻接矩阵存储及输出

    无向图的邻接矩阵存储及输出无向图的邻接矩阵存储及输出

    c++ 无向图求度

    c + + 无 向 图 求 度 ,程 序 源 代 码, 调 试 运 行 通 过 。

    数据结构-c语言-带main函数-图7.3-图的遍历-广度优先搜索-队列-邻接表-无向图。

    在本文中,我们将深入探讨如何使用C语言实现无向图的广度优先搜索(BFS)遍历,其中涉及到了数据结构如邻接表、队列,并使用了CFree软件进行辅助开发。首先,让我们详细了解这些概念。 **数据结构:邻接表** 邻接表...

    无向图_C语言_

    从提供的文件名列表来看,`无向图.cpp`可能是源代码文件,`无向图.dsp`、`无向图.dsw`、`无向图.ncb`、`无向图.opt`、`无向图.plg`则是Visual Studio项目文件,用于编译和管理C++项目。这些文件在实际开发环境中用于...

    图的遍历(包括深度 广度遍历 利用邻接矩阵 利用邻接表)

    这两种遍历方式在计算机科学中有着广泛的应用,例如在搜索算法、路径查找、网络拓扑排序、有向无环图(DAG)的任务调度等领域。 首先,我们来详细了解一下深度优先搜索(DFS)。DFS是一种递归的遍历策略,其基本思想是...

    图的建立和遍历的c++实现(邻接表储存)

    无向图中的边没有方向,而有向图中的边则具有方向。 邻接表是图的一种高效存储方式,尤其适用于稀疏图(即边的数量远小于顶点数量的平方)。对于每个顶点,邻接表维护了一个列表,包含所有与该顶点相连的其他顶点。...

    critical_path-关键路径-邻接表有向图.zip_AdjListDirNetwork.h_C++ 有向图_buffal

    本资源提供了基于邻接表有向图的C++实现,用于寻找关键路径。邻接表是一种图数据结构,它以列表的形式存储图中每个顶点的邻接顶点。在有向图中,边是从一个顶点(源)指向另一个顶点(目标)。这种表示方式特别适合...

    图的邻接矩阵和邻接表表示的各种算法

    对于无向图,每个节点的链表包含所有与之相连的节点;对于有向图,链表仅包含其指向的节点。 - 邻接表的空间效率更高,但查询是否存在边的时间复杂度略高,需要遍历链表。 3. **迪杰斯特拉算法**: - 迪杰斯特拉...

    C++无向图深度优先和广度优先遍历(编译可运行).rar

    以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 注: 1.代码共182行。 2.代码经过多次编译运行,无错误。

    图的邻接矩阵和邻接表存储结构(C++)

    对于无向图,邻接矩阵是对称的,即对于任意两个顶点i和j,`matrix[i][j] == matrix[j][i]`。对于有向图,矩阵可能不对称,因为从顶点i到顶点j的边可能与反向边不同。 在C++中,我们可以创建一个二维动态数组来实现...

    数据结构:判别k长度简单路径(邻接表)

    本文将详细探讨如何利用邻接表来处理无向图,并实现一个算法,判断图中两个顶点间是否存在长度为k的简单路径。我们将遵循限制深度的深度优先搜索(DFS)策略来解决这个问题。 首先,我们需要了解邻接表的概念。邻接...

    图的邻接矩阵存储和邻接表存储

    如果图中有顶点i和j之间的边,那么矩阵中的元素`matrix[i][j]`(或`matrix[j][i]`,取决于是否考虑无向图)的值为1或非零,否则为0。对于无向图,矩阵是对称的;对于有向图,矩阵可能不对称。 在C++中,我们可以...

    C++ 数据结构 邻接矩阵

    设计一个有向图和一个无向图,使用邻接矩阵和邻接表存储结构,完成在这两种存储结构下有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。 三、实验要求: 1. 根据实验内容编程,画出你所设计的图,...

    图的邻接表操作源代码

    本篇将详细介绍邻接表的概念、如何用邻接表构建有向图和无向图,并涉及与之相关的操作,如计算顶点度、拓扑排序以及图的深度优先遍历(DFS)和广度优先遍历(BFS)。 1. **邻接表的定义**: 邻接表是图数据结构的...

    数据结构 图 邻接表

    4. 拓扑排序:对于有向无环图(DAG),可以按照没有前驱的顺序排列所有顶点。 5. 最短路径算法:如Dijkstra算法或Floyd-Warshall算法,用于找到两个顶点之间的最短路径。 在编程实现时,可以使用各种编程语言,如...

    dijkstra算法 C++ 堆排序 邻接表实现

    在有向图或无向图中,该算法都能找到单源最短路径。 1. **算法步骤:** - 初始化:设置源节点距离为0,其余节点距离设为无穷大(或初始值大于任何可能的实际距离),并将所有节点放入未访问集合。 - 每次选取未...

    用邻接多重表实现图遍历演示

    很不错的啊 邻接多重表实现的,功能很多的

    深度优先算法--邻接表

    对于无向图,邻接表需要两个边节点来表示一条边,因为每条边连接两个顶点,所以节点数量为2e。而有向图只需一个边节点,因此节点数量为e。建立邻接表的时间复杂度通常为O(n*e),但如果顶点信息可以直接用顶点的下标...

Global site tag (gtag.js) - Google Analytics