图的存储结构-十字链表

这篇具有很好参考价值的文章主要介绍了图的存储结构-十字链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图的存储结构-十字链表

十字链表(Orthogonal List)是有向图的一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点。

十字链表的结构

顶点结点

十字链表,数据结构,链表,数据结构,算法

typedef string InfoType ;
typedef string VertexType;

typedef struct VexNode{
    VertexType data; //顶点的数据域
    ArcBox *firstIn; //指向该顶点的第一条入弧
    ArcBox *firstOut; //指向该顶点的第一条出弧
}VexNode;

弧结点

十字链表,数据结构,链表,数据结构,算法

typedef struct ArcBox{
    int tailVex; //该弧的尾顶点的位置
    int headVex; //该弧的头顶点的位置
    struct ArcBox * hLink; //弧头相同的弧的链域
    static ArcBox * tLink; //弧尾相同的弧的链域
    InfoType info; //弧的相关信息
}ArcBox;

十字链表结点:

#define MAX_VERTEX_BUM 20
typedef struct {
    VexNode xList[MAX_VERTEX_BUM]; //表头向量
    int vexNum; //图的顶点个数
    int arcNum; //图的边数
}OLGraph;

有向图十字链表

在弧结点中有5个域:其中尾域(tailvex)和头域(headvex)分别指示弧尾和弧头这两个顶点在图中的位置,链域hlink指向弧头相同的下一条弧,而链域tlink指向弧尾相同的下一条弧,info域指向该弧的相关信息。弧头相同的弧在同一链表上,弧尾相同的弧也在同一链表上。
它们的头结点即为顶点结点,它由3个域组成:其中data域存储和顶点相关的信息,如顶点的名称等;firstIn和firstOut为两个链域,分别指向以该顶点为弧头或弧尾的第一条弧结点。如下图:
十字链表,数据结构,链表,数据结构,算法
若将有向图的邻接矩阵看成稀疏矩阵的话,则十字链表也可以看成是邻接矩阵的链式存储结构,在图的十字链表中,弧结点所在的链表非循环链表,结点之间相对位置自然形成,不一定按顶点序号有序,表头结点即顶点,它们之间不是链接,而是顺序存储。

使用十字链表法创建一个有向图

OLGraph CreateOLG() {
    OLGraph G;
    cout << "输入顶点的总数,边的总数 G(V,E)" << endl;
    cin >> G.vexNum >> G.arcNum;  //输入总顶点数,总边数

    for (int vi = 0; vi < G.vexNum; ++vi) {
        cout << "输入顶点" << vi << "的值:" << endl;
        cin >> G.xList[vi].data;    //输入顶点的值
        G.xList[vi].firstIn = NULL; //初始化入弧表
        G.xList[vi].firstOut = NULL; //初始化出弧表
    }

    int i = -1, j = -1;
    for (int k = 0; k < G.arcNum; ++k) {
        VertexType v1, v2;
        cout << "请输入边的值 (vi,vj) " << endl;
        cin >> v1 >> v2; //输入一条边依附的两个顶点
        i = LocateVex(G, v1); //获得v1 在G.xList[]中的位置
        j = LocateVex(G, v2); //获得v2 在G.xList[]中的位置

        ArcBox *p1 = new ArcBox;  //生成一个新的边 *p1
        p1->tailVex = i; //弧尾的顶点位置
        p1->headVex = j; //弧头的顶点位置
        p1->tLink = G.xList[i].firstOut;
        p1->hLink = G.xList[j].firstIn;
        G.xList[i].firstOut = p1;
        G.xList[j].firstIn = p1;

    }
    return G;
}
/**
 * 若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其它信息;
 */
int LocateVex(OLGraph G, VertexType u) {
    int i;
    for (i = 0; i < G.vexNum; ++i)
        if (u == G.xList[i].data)
            return i;
    return -1;
}

过程图解

1.初始化图G(V,E);

		cin >> G.xList[vi].data;    //输入顶点的值
        G.xList[vi].firstIn = NULL; //初始化入弧表
        G.xList[vi].firstOut = NULL; //初始化出弧表

十字链表,数据结构,链表,数据结构,算法
2.创建一个边结点

 		ArcBox *p1 = new ArcBox;  //生成一个新的边 *p1
        p1->tailVex = i; //弧尾的顶点位置
        p1->headVex = j; //弧头的顶点位置

十字链表,数据结构,链表,数据结构,算法
3.将边结点加入十字链表
先将边结点的插入弧尾相同的链表表头;

 		p1->tLink = G.xList[i].firstOut;

十字链表,数据结构,链表,数据结构,算法
在把边结点的插入弧头相同的链表表头;

		p1->hLink = G.xList[j].firstIn;

十字链表,数据结构,链表,数据结构,算法
最后让 弧尾顶点的第一条出弧、弧头顶点的第一条入弧,指向新加入的边界点;

        G.xList[i].firstOut = p1;
        G.xList[j].firstIn = p1;

十字链表,数据结构,链表,数据结构,算法
4.继续加入先得边结点
十字链表,数据结构,链表,数据结构,算法
十字链表,数据结构,链表,数据结构,算法
十字链表,数据结构,链表,数据结构,算法
十字链表,数据结构,链表,数据结构,算法文章来源地址https://www.toymoban.com/news/detail-744750.html

到了这里,关于图的存储结构-十字链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵的快速转置、十字链表)

    前几期期链接: 【数据结构】栈与队列的概念和基本操作代码实现 【数据结构】树与二叉树的概念与基本操作代码实现 k维数组的定义: k 维数组 D = { a j 1 , j 2 , . . . , j k } k维数组D={ a_{j_1, j_2, ..., j_k} } k 维数组 D = { a j 1 ​ , j 2 ​ , ... , j k ​ ​ } k 0 称为数组的维数,

    2024年04月09日
    浏览(140)
  • 西工大NOJ数据结构理论——013.以十字链表为存储结构实现矩阵相加(严5.27)

      我第一下拿到这个题目,第一反应就是先 定义好数据结构 ,然后构建好十字链表基础操作的函数,也就是“ 创插遍历 ”这些操作。下面是我的定义和函数操作。 typedef int ElemType; typedef struct OLNode{     int i,j;//行号和列号     ElemType elem;     struct OLNode *right;//右边元素 

    2023年04月26日
    浏览(86)
  • 【数据结构】数组和字符串(十):稀疏矩阵的链接存储:十字链表的矩阵操作(加法、乘法、转置)

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月08日
    浏览(61)
  • 【数据结构】数组和字符串(八):稀疏矩阵的链接存储:十字链表的创建、插入元素、遍历打印(按行、按列、打印矩阵)、销毁

    【数据结构】数组和字符串(一):矩阵的数组表示   矩阵是以按行优先次序将所有矩阵元素存放在一个一维数组中。但是对于特殊矩阵,如对称矩阵、三角矩阵、对角矩阵和稀疏矩阵等, 如果用这种方式存储,会出现大量存储空间存放重复信息或零元素的情况,这样会造

    2024年02月06日
    浏览(55)
  • 数据结构——十字链表

    什么是十字链表: 十字链表(Orthogonal List) 是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。 了解十字链表:         我们来看下面这

    2024年02月05日
    浏览(41)
  • 【数据结构】十字链表的画法

    有向边又称为弧 假设顶点 v 指向 w,那么 w 称为弧头,v 称为弧尾 顶点节点采用顺序存储 顶点节点 data:存放顶点的信息 firstin:指向以该节点为终点(弧头)的弧节点 firstout:指向以该节点为起点(弧尾)的弧节点 弧节点 tailvex:起点(弧尾)在数组中的索引 headvex:终点(

    2024年02月11日
    浏览(48)
  • 数据结构--图的存储结构

    第九话  数据结构之图的存储 文章目录 一、了解什么是图 二、图的定义和基本术语 三、存储结构之邻接矩阵 1.邻接矩阵的介绍 2.邻接矩阵的创建 3.主函数中实现 四、存储结构之邻接表 1.邻接表的介绍 2.邻接表的创建 3.在主函数中实现 五、总结 一切尽在图结构 图的应用非

    2024年02月07日
    浏览(55)
  • 数据结构—图的存储结构

    回顾:数据的逻辑结构 集合——数据元素间除 “同属于一个集合” 外,无其他关系。 线性结构——一个对一个,如线性表、栈、队列 树形结构——一个对多个,如树 图形结构——多个对多个,如图 6.1图的定义和术语 无向图 :每条边都是 无 方向的; 有向图 :每条边都是

    2024年02月14日
    浏览(37)
  • 16-数据结构-图的存储结构

    简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向图。无向图为对称矩阵,因为没有方向可言,出度入

    2024年02月09日
    浏览(38)
  • 【数据结构】图的定义、存储

    对王道数据结构选择题做错和不清楚的题的简单纠错 一个有n个顶点和n条边的无向图一定是 有环的 一个无向图有n个顶点和n-1条边,可以使它连通单没有环,若再加一条边,则会形成环 若图中顶点数为n,则它的生成树有n-1条边,去掉一条边变成非连通图;加上一条边变成一

    2024年02月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包