数据结构总目录

十字链表

1. 图文解析

在无向图中,两个顶点之间的连接我们称之为边;

而在有向图中,两个顶点之间具有方向的连接称之为英文:Arc
如下图中弧(A->B)的权值=10,其中A为该弧的头顶点,B为该弧的尾顶点

也可以理解为在无向图中每条边都存在两条弧

十字链表的结构和邻接表的结构较为相似,同样采用了顺序表与链表结构的结合,但在十字链表中存在两个链表,分别用于表示相同头顶点和尾顶点的弧链表。

边结点结构图

顶点结点结构图

图与十字链表

1、在十字链表中,如果仅看相同头顶点的弧链表,其结构和邻接表相同,采用头插法插入弧结点
2、对于相同尾结点的弧链表,实际上就是在已插入的弧结点中,对相同尾顶点的弧结点进行链接,其操作也是链表的头插法。

2. 源代码

#include <stdio.h>
#include <stdlib.h>
#define MaxVex 20typedef int ArcType;
typedef char VertexType;// 弧结点结构
typedef struct ArcNode
{ArcType arcData;        // 弧的数据int headVertex, tailVertex;   // 弧的头顶点和尾顶点struct ArcNode *nextHeadArc, *nextTailArc;  // 指向相同头、尾顶点的弧指针
}ArcNode, *ArcList;// 顶点结点结构
typedef struct VertexNode
{VertexType vertexData;      // 顶点的数据ArcList headList, tailList; // 相同头、尾顶点的弧链表
}VertexNode, *VertexList;// 十字链表结构
typedef struct
{VertexList vertexList;int numVertexs, numArcs;
}OLGraph;// 初始化十字链表
void InitOLGraph(OLGraph *G)
{// 初始化顶点G->numVertexs = 0;G->numArcs = 0;G->vertexList = (VertexNode *)malloc(MaxVex * sizeof(VertexNode));// 初始化顶点的两个链表头结点(也可不带头结点)int i;for (i = 0; i < MaxVex; i++){// 相同头顶点的弧链表G->vertexList[i].headList = (ArcNode *)malloc(sizeof(ArcNode));G->vertexList[i].headList->nextHeadArc = NULL;G->vertexList[i].headList->nextTailArc = NULL;// 相同尾顶点的弧链表G->vertexList[i].tailList = (ArcNode *)malloc(sizeof(ArcNode));G->vertexList[i].tailList->nextHeadArc = NULL;G->vertexList[i].tailList->nextTailArc = NULL;}printf("已初始化十字链表!\n");
}// 创建十字链表
void CreateOLGraph(OLGraph *G)
{printf("请输入顶点数和弧数:");scanf("%d %d", &G->numVertexs, &G->numArcs);// 输入顶点数据int i, j, k;for (i = 0; i < G->numVertexs; i++){fflush(stdin);printf("请输入第%d个顶点信息:", i + 1);scanf("%c", &G->vertexList[i].vertexData);}// 输入弧结点数据ArcType w;for (k = 0; k < G->numArcs; k++){printf("请输入弧(Ai, Aj)的头、尾顶点及其权值:");scanf("%d %d %d", &i, &j, &w);// 创建新的弧结点,并设置该弧结点的数据和头尾顶点的下标ArcNode *s;s = (ArcNode *)malloc(sizeof(ArcNode));s->arcData = w;s->headVertex = i - 1;s->tailVertex = j - 1;// 头插法插入相同头顶点的弧链表s->nextHeadArc = G->vertexList[i - 1].headList->nextHeadArc;G->vertexList[i - 1].headList->nextHeadArc = s;// 头插法插入相同尾顶点的弧链表s->nextTailArc = G->vertexList[j - 1].tailList->nextTailArc;G->vertexList[j - 1].tailList->nextTailArc = s;}printf("已完成十字链表的创建!\n");
}void DisplayOLGraph(OLGraph G)
{int i;ArcNode *p;for (i = 0; i < G.numVertexs; i++){printf("顶点:%c\n", G.vertexList[i].vertexData);// 相同头顶点的弧链表printf("\t相同头顶点的弧:");p = G.vertexList[i].headList;while (p->nextHeadArc){p = p->nextHeadArc;printf("(%c)%d(%c) => ", G.vertexList[p->headVertex].vertexData,p->arcData, G.vertexList[p->tailVertex].vertexData);}printf("NULL\n");// 相同尾顶点的弧链表printf("\t相同尾顶点的弧:");p = G.vertexList[i].tailList;while (p->nextTailArc){p = p->nextTailArc;printf("(%c)%d(%c) => ", G.vertexList[p->headVertex].vertexData,p->arcData, G.vertexList[p->tailVertex].vertexData);}printf("NULL\n");}
}int main()
{OLGraph G;InitOLGraph(&G);CreateOLGraph(&G);DisplayOLGraph(G);system("pause");return 0;
}

3. 测试结果

数据结构_十字链表(C语言)相关推荐

  1. 数据结构java稀疏矩阵_数据结构之十字链表——稀疏矩阵的链式存储及加法运算...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以下简单实现了数据结构中的十字链表(Java实现):代码为添加(add)方法及求和(sum)方法,其它方法后续有时间再添加,最下面有测试方法 CrossL ...

  2. 稀疏矩阵建立十字链表c语言,实验6-稀疏矩阵十字链表的存储.doc

    实验6-稀疏矩阵十字链表的存储.doc -/电子信息学院实验报告书课程名 数据结构 题 目 稀疏矩阵十字链表的存储 实验类别 设计 班 级 BX1001 学 号 24 姓 名 肖望龙 2011年 10 ...

  3. 数据结构_线索二叉树(C语言)

    数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...

  4. 数据结构_排序二叉树(C语言)

    数据结构总目录 排序二叉树 1. 结构解析 排序二叉树的结构规则很简单,只遵循一个基本规则: 那就是在二叉树中,选择任意根结点,其左子树都比根节点小,右子树都比根节点大. 排序二叉树结构图 观察如下二 ...

  5. 数据结构_分块查找(C语言)

    数据结构总目录 分块查找 分块查找又称索引顺序查找,这是一种性能介于顺序查找和折半查找之间的一种查找方法,也是顺序查找和折半查找的组合查找结合查找方法. 1. 图文解析 在分块查找中 (1)需要建立一 ...

  6. 图十字链表并求度c语言,第5章_西安电子科技大学出版社:算法与数据结构-C语言描述(樊希平)_doc_大学课件预览_高等教育资讯网...

    第5章 数组和广义表要点: 1.掌握数组元素存储位置的换算: 2.了解特殊矩阵地存储方法和元素存储位置计算: 3.了解广义表的长度.深度.head.tail等概念和操作和存储结构. 教材习题解答: 5 ...

  7. 数据结构——十字链表(C语言实现)

    十字链表是将邻接表和逆邻接表结合在一起的一种有向图的数据结构 十字链表的节点结构体表示的是一个节点到另一个节点的边,并且此由指出节点(from)和指入节点(to)共同使用,因此大大节省了内存. 先直观 ...

  8. noj数据结构稀疏矩阵的加法十字链表_数据结构学习(C )稀疏矩阵(十字链表1)

    CSDN 先说说什么叫稀疏矩阵. 你说, 这个问题很简单吗, 那你一定不知道中国学术界的嘴皮子仗, 对一个字眼的"抠"将会导致两种相反的结论.这是清华 2000 年的一道考研题:& ...

  9. 【数据结构】图的存储结构(邻接矩阵、邻接表、十字链表、邻接多重表)及实现(C语言)

    目录 1. 邻接矩阵表示法 1.1 图的邻接矩阵 1.2 创建有向网的邻接矩阵 2. 邻接表表示法 2.1 图的邻接表存储结构 2.2 创建有向图的邻接表 3. 十字链表表示法 3.1 图的十字链表存 ...

  10. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

最新文章

  1. server正式的环境性能测试nginx-php 指着寻求突破的表现
  2. mysql nan_mysql在工作中的积累
  3. developer pack_上汽大众MEB电池Pack制造车间
  4. HashOperations
  5. Java基础之this关键字和super关键字区别
  6. cad2007 钢筋符号显示为问号
  7. java基础教程知识点,[Java教程]js基础知识点总结
  8. Cisco路由配置命令
  9. 【区块链】区块链是什么?
  10. Centos上安装jdk版本出错的问题
  11. 没有tools.jar包的解决办法
  12. python 之selectors 实现文件上传下载
  13. 同步十二进制加法计数电路设计(D触发器)
  14. 基于STM32F429,Cubemx的SDHC卡的基本Fatfs文件移植
  15. windows10电脑连接小爱音箱(完美解决连接上无声音)
  16. [Design]国粹京剧 脸谱表情 值得收藏
  17. 对硬盘操作的API介绍以及应用测试
  18. 银行ATM存取款页面简易版练习(python)
  19. 基于ZigBee和STM32的智能家居控制系统的设计与实现(二)
  20. JS 声音提示 兼容所有浏览器

热门文章

  1. 学习网络编程推荐安装的软件
  2. Nginx通过反向代理实现单端口访问多个服务
  3. 在 Windows 10 上用超级终端配置 Cisco 3560 Series 交换机并创建 VLAN
  4. 数字调制解调—扩频通信和伪码同步
  5. Quartus II下进行SignalTap仿真
  6. Redis中Pipeline的使用
  7. android 腾讯地图demo,腾讯地图调用Demo
  8. Glide圆角和centerCrop()的那些坑
  9. docker安装awvs13
  10. Charles使用教程(Mac)