数据结构_十字链表(C语言)[通俗易懂]

数据结构_十字链表(C语言)[通俗易懂]十字链表1.十字链表图文解析十字链表是有向图的一种存储结构在十字链表里我们称每一条有向边为:弧十字链表的存储结构主要包括:弧结点和顶点结点,如下图:由以上结构组成的有向图如下:红线:与邻接表一样,可以采用头插法插入弧结点绿线:指向同一个尾顶点的弧结点黑线:指向该顶点的绿线弧结点链表,例如顶点V2—>弧的链表(每个弧结点的头顶点都为V2)十字链表的构造方法:2.源代码及测试#include<stdio.h>#include<stdlib.h

大家好,又见面了,我是你们的朋友全栈君。

数据结构总目录



十字链表

1. 图文解析

在无向图中,两个顶点之间的连接我们称之为边;
在这里插入图片描述
而在有向图中,两个顶点之间具有方向的连接称之为英文:Arc
如下图中弧(A->B)的权值=10,其中A为该弧的头顶点,B为该弧的尾顶点
在这里插入图片描述
也可以理解为在无向图中每条边都存在两条弧

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

边结点结构图
在这里插入图片描述
顶点结点结构图
在这里插入图片描述

图与十字链表

在这里插入图片描述

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

2. 源代码

#include <stdio.h>
#include <stdlib.h>
#define MaxVex 20
typedef 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. 测试结果

在这里插入图片描述

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150325.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 嵌入式系统中启动Hostapd

    嵌入式系统中启动Hostapd项目过程中需要添加AP热点的需求,自然会想用到hostapd,具体的不做分析,自行百度,这里主要分析下启动脚本采用的WiFi模组是“博通”公司的AP6255芯片,“博通”公司的wifi芯片AP与STATION切换需要对网卡驱动进行卸载重装,所以配网方式不建议使用AP模式配网,这会造成多次WiFi模式的切换,耗时可能比较严重。不过给出以下方法,开发者可以自行配置,进入…

  • L. Digit sum (ICPC 2019 上海网络赛)

    L. Digit sum (ICPC 2019 上海网络赛)

  • 使用 EasyPOI 优雅导出Excel模板数据(含图片)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:星悬月 blog.csdn.net/u012441819/article/details/96828044 E…

  • jmeter   如果(if)控制器使用,如果满足条件则执行操作。

    jmeter   如果(if)控制器使用,如果满足条件则执行操作。

  • 操作系统——银行家算法

    操作系统——银行家算法自从写完第一篇博客,发现写博客也挺好玩的,比平时写word应付作业有趣的多,而且文章在网上还能帮助别人,自己平时也经常看CSDN,这不,老师要求我们实现一下操作系统的银行家算法,所以我就来了!那么,什么是银行家算法呢?如果你很了解请跳过这一段,就是解决死锁问题的一个算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判…

  • STM32项目设计:基于STM32F4的电子阅读器制作教程[通俗易懂]

    STM32项目设计:基于STM32F4的电子阅读器制作教程[通俗易懂]基于STM32F4的电子阅读器一、项目功能要求项目说明:项目偏软件,但是要依赖于自己对硬件的熟悉和驱动才能完成用到的主要技术:SD卡驱动(难–不过可移植SD卡驱动细节可在用完再了解其驱动协议)FatFs文件系统移植使用LCD屏驱动(加载字库文件做字库在LCD上的显示)功能要求:开机Logo电子书列表扫描电子书列表显示及小说选择菜单阅读功能:字体选择字体大小选择字体颜色设置阅读背景设置书签设置能够记录每本电子书的退出时处于什么阅读位置下

发表回复

您的电子邮箱地址不会被公开。

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