邻接表无向图的介绍
邻接表无向图是指通过邻接表表示的无向图。
上面的图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
相关推荐
### 图的邻接表C++表示 在计算机科学领域,图是一种重要的数据结构,用于模拟对象之间的关系。根据图中的边是否具有方向性,可以将图分为无向图和有向图。对于稀疏图(即边的数量远小于顶点数量的平方),邻接表是...
通过阅读和分析这些材料,可以深入理解无向图的邻接矩阵和邻接表表示,以及约瑟夫环问题的编程实现,同时还能了解到如何使用MFC构建GUI应用程序。 总之,这个数据库课程设计涵盖了数据结构中的核心概念,包括无向图...
### 无向图的邻接矩阵存储及输出详解 在计算机科学中,图是一种重要的数据结构,用于表示对象之间的关系。图由顶点(或节点)和边组成,其中边可以是有向的或无向的。本文将详细介绍无向图的邻接矩阵存储方式以及...
c ++使用邻接表实现无向图。
1. **图的存储结构**:实验要求使用邻接表来存储连通无向图。在邻接表中,每个顶点都有一个链表,链表中的节点代表与该顶点相连的其他顶点。这种结构适合处理稀疏图,即边的数量远小于顶点数量的平方。 2. **深度...
本项目提供了一个C++实现的邻接表,能够处理有向图和无向图,并且使用了类模板来增强代码的通用性。以下是对这个项目的详细解释: 首先,邻接表是一种存储图的有效方式,尤其适用于稀疏图(即边的数量远小于顶点...
c + + 无 向 图 求 度 ,程 序 源 代 码, 调 试 运 行 通 过 。
在本文中,我们将深入探讨如何使用C语言实现无向图的广度优先搜索(BFS)遍历,其中涉及到了数据结构如邻接表、队列,并使用了CFree软件进行辅助开发。首先,让我们详细了解这些概念。 **数据结构:邻接表** 邻接表...
从提供的文件名列表来看,`无向图.cpp`可能是源代码文件,`无向图.dsp`、`无向图.dsw`、`无向图.ncb`、`无向图.opt`、`无向图.plg`则是Visual Studio项目文件,用于编译和管理C++项目。这些文件在实际开发环境中用于...
- 如果图是无向图,那么邻接矩阵是对称的,即\[A\_{ij} = A\_{ji}\]; - 如果图是有向图,则矩阵不对称; - 对于无权图,矩阵中的值通常为0或1,0表示不存在边,1表示存在边; - 对于带权图,矩阵中的非零值表示边的...
无向图中的边没有方向,而有向图中的边则具有方向。 邻接表是图的一种高效存储方式,尤其适用于稀疏图(即边的数量远小于顶点数量的平方)。对于每个顶点,邻接表维护了一个列表,包含所有与该顶点相连的其他顶点。...
本文将详细探讨如何利用邻接表来处理无向图,并实现一个算法,判断图中两个顶点间是否存在长度为k的简单路径。我们将遵循限制深度的深度优先搜索(DFS)策略来解决这个问题。 首先,我们需要了解邻接表的概念。邻接...
这两种遍历方式在计算机科学中有着广泛的应用,例如在搜索算法、路径查找、网络拓扑排序、有向无环图(DAG)的任务调度等领域。 首先,我们来详细了解一下深度优先搜索(DFS)。DFS是一种递归的遍历策略,其基本思想是...
本资源提供了基于邻接表有向图的C++实现,用于寻找关键路径。邻接表是一种图数据结构,它以列表的形式存储图中每个顶点的邻接顶点。在有向图中,边是从一个顶点(源)指向另一个顶点(目标)。这种表示方式特别适合...
对于无向图,每个节点的链表包含所有与之相连的节点;对于有向图,链表仅包含其指向的节点。 - 邻接表的空间效率更高,但查询是否存在边的时间复杂度略高,需要遍历链表。 3. **迪杰斯特拉算法**: - 迪杰斯特拉...
以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。 注: 1.代码共182行。 2.代码经过多次编译运行,无错误。
对于无向图,邻接矩阵是对称的,即对于任意两个顶点i和j,`matrix[i][j] == matrix[j][i]`。对于有向图,矩阵可能不对称,因为从顶点i到顶点j的边可能与反向边不同。 在C++中,我们可以创建一个二维动态数组来实现...
如果图中有顶点i和j之间的边,那么矩阵中的元素`matrix[i][j]`(或`matrix[j][i]`,取决于是否考虑无向图)的值为1或非零,否则为0。对于无向图,矩阵是对称的;对于有向图,矩阵可能不对称。 在C++中,我们可以...
这包括构造有向图、有向网、无向图和无向网,以及进行深度优先遍历。首先,我们来理解图和网之间的区别。 **图和网的区别**: 图是由顶点和连接顶点的边构成的数据结构。网则是图的一种特殊形式,它包含了带权值的...
邻接多重表是一种用于存储无向图的数据结构,它通过在每个顶点处维护一个指向与之相连的所有边的链表来表示图。这种数据结构不仅可以高效地存储图数据,而且可以方便地进行图的遍历操作,如深度优先搜索(DFS)和...