C语言如何创建及遍历十字链表
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章将为大家详细讲解有关C语言如何创建及遍历十字链表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、十字链表是什么?十字链表常用于表示稀疏矩阵,可视作稀疏矩阵
千家信息网最后更新 2025年02月01日C语言如何创建及遍历十字链表
这篇文章将为大家详细讲解有关C语言如何创建及遍历十字链表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、十字链表是什么?
十字链表常用于表示稀疏矩阵,可视作稀疏矩阵的一种链式表示,因此,这里以稀疏矩阵为背景介绍十字链表。不过,十字链表的应用远不止稀疏矩阵,一切具有正交关系的结构,都可用十字链表存储。
二、十字链表的存储结构
1.用于总结点的存储结构
m
:总行数
n
:总列数
len
:总元素个数
row_head
:行指针数组(通过行指针数组可以快速定位到某一行)
col_head
:列指针数组
2.用于单个节点的存储结构
row
:行数
col
:列数
value
:存储的元素值
right
:右指针域
down
:下指针域
3.对于每一行,通过指针数组记录下每一行的头节点位置,对于列来说相同
4.通过对某一行,某一列的元素可以快速访问
三、代码实现
1.引入头文件并定义结构体
#include#include /*十字链表的总结点结构类型定义如下:*/typedef struct OLNode{ int row, col; /*非零元素的行和列下标*/ int value; struct OLNode* right; /*非零元素所在行表、列表的后继链域*/ struct OLNode* down;}OLNode, *OLink; /*单个节点结构类型定义如下:*/typedef struct{ OLink* row_head; /*行、列链表的头指针向量*/ OLink* col_head; int m, n, len; /*稀疏矩阵的行数、列数、非零元素的个数*/}CrossList;void out_M(CrossList M);void CreateCrossList(CrossList* M);
2.建立十字链表
void CreateCrossList(CrossList* M){ int m, n, t, i, j, e; OLNode* p;//单元的结构体指针 OLNode* q;/*采用十字链表存储结构,创建稀疏矩阵M*/ printf("请输入行数,列数和非零元素的个数\n"); scanf_s("%d%d%d", &m, &n, &t); /*输入M的行数,列数和非零元素的个数*/ M->m = m; M->n = n; M->len = t; M->row_head = (OLink*)malloc((m + 1) * sizeof(OLink)); M->col_head = (OLink*)malloc((n + 1) * sizeof(OLink));/*初始化行、列头指针向量,各行、列链表为空的链表*/ for (int h = 0; h < m + 1; h++) { M->row_head[h] = NULL; } for (int t = 0; t < n + 1; t++) { M->col_head[t] = NULL; } printf("请输入第i行,第j列中存储的元素,以0结束\n"); for (scanf_s("%d%d%d", &i, &j, &e); i != 0; scanf_s("%d%d%d", &i, &j, &e)) { p = (OLNode*)malloc(sizeof(OLNode)); p->row = i; p->col = j; p->value = e; /*生成结点*/ /*在十字链表中插入节点,对于行指针数组和列指针数组分开看,类似于单链表中的插入操作*/ if (M->row_head[i] == NULL) { M->row_head[i] = p; p->right = NULL; } else {/*寻找行表中的插入位置*/ for (q = M->row_head[i]; q->right && q->right->col < j; q = q->right); /*空循环体*/ p->right = q->right; q->right = p; /*完成插入*/ } if (M->col_head[j] == NULL) { M->col_head[j] = p; p->down = NULL; } else {/*寻找列表中的插入位置*/ for (q = M->col_head[j]; q->down && q->down->row < i; q = q->down); /*空循环体*/ p->down = q->down; q->down = p; /*完成插入*/ } }}
3.遍历十字链表
void out_M(CrossList M){ /*遍历十字链表的思想:可采用双重for循环实现,对于每一行中的每一列进行遍历输出*/ int i; OLNode* p; char ch; /* 输出矩阵的总行数、总列数、非零元素总个数 */ printf("\n 总行数有%d 总列数有%d 非零元素有%d\n", M.m,M.n,M.len); for (i = 1; i <= M.m; i++) { p = M.row_head[i]; /* 指向第i行 */ if (p) { printf("\n 第%d行的数据如下\n", i); while (p) { printf(" (%3d%3d%4d) ", p->row, p->col, p->value); p = p->right; } } printf("\n"); }}
4.调用函数
void out_M(CrossList M){ /*遍历十字链表的思想:可采用双重for循环实现,对于每一行中的每一列进行遍历输出*/ int i; OLNode* p; char ch; /* 输出矩阵的总行数、总列数、非零元素总个数 */ printf("\n 总行数有%d 总列数有%d 非零元素有%d\n", M.m,M.n,M.len); for (i = 1; i <= M.m; i++) { p = M.row_head[i]; /* 指向第i行 */ if (p) { printf("\n 第%d行的数据如下\n", i); while (p) { printf(" (%3d%3d%4d) ", p->row, p->col, p->value); p = p->right; } } printf("\n"); }}
关于"C语言如何创建及遍历十字链表"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
十字
元素
指针
结构
矩阵
存储
稀疏
一行
个数
数组
总行
节点
循环
输出
位置
篇文章
输入
语言
单个
向量
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发 长沙
网络安全日志跟踪诊断
百度软件开发部经理年薪
java软件开发平台
律师服务器
计算机网络安全结构
湖南百信云龙服务器单价
图书馆数据库的万方论文咋看
我的世界没有服务器压印自动化
2020国家网络安全攻防演练
网络安全 登录不了政府网站
数据库推广的软件
linux服务器查看网卡名字
数据库管理技术有哪三个阶段
网络安全设备配置
服务器安全评价工具
张家港品牌网络技术怎么样
京东抢购秒杀软件开发思路
广东省幸福网络技术有限公司
ftp服务器架构
水星上海软件开发
网络安全我参与广播稿 300字
网络安全和信息工作实施方案
wbe开发与软件开发
长江委网络安全事件分为三级
中学校园网络安全检查
徐汇区智能网络技术质量服务
延锋软件开发地址
网络安全等级保护测评降级
融合软件开发