您现在的位置是:群英 > 开发技术 > 编程语言
用C语言怎样实现十字链表?一文带你看懂过程
Admin发表于 2021-12-23 19:15:341629 次浏览

    这篇文章我们来了解用C语言怎样实现十字链表的内容,一些朋友可能对于十字链表是什么也不是很了解,对此下文会介绍十字链表及十字链表的实现,但是本文示例需要读者有一定代码基础会更好理解,最好是能了解指针,链表,数组等这些诶,那么接下来就跟随小编来一起学习一下吧!

一、十字链表是什么?

    十字链表常用于表示稀疏矩阵,可视作稀疏矩阵的一种链式表示,因此,这里以稀疏矩阵为背景介绍十字链表。不过,十字链表的应用远不止稀疏矩阵,一切具有正交关系的结构,都可用十字链表存储。

二、十字链表的存储结构

    1.用于总结点的存储结构

    m:总行数

    n:总列数

    len:总元素个数

    row_head:行指针数组(通过行指针数组可以快速定位到某一行)

    col_head:列指针数组

    2.用于单个节点的存储结构

    row :行数

    col:列数

    value:存储的元素值

    right :右指针域

    down:下指针域

    3.对于每一行,通过指针数组记录下每一行的头节点位置,对于列来说相同

    4.通过对某一行,某一列的元素可以快速访问

三、代码实现

     1.引入头文件并定义结构体

#include <stdio.h> 
#include<stdlib.h>
/*十字链表的总结点结构类型定义如下:*/
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语言怎样实现十字链表应该都清楚了吧,上述示例有一定的借鉴价值,有需要的朋友可以参考学习,希望对大家学习C语言有帮助,想要了解更多大家可以关注群英网络其它相关文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-12-24 11:47:01 
摘要:判断步骤:1、用array_keys()获取原数组的全部键名,语法“array_keys(数组)”;2、用array_filter()过滤数组,语法“function f($v){return(is_string($v));}$res=array_filter($keys,"f");”,会返回一个包含字符串元素的过滤数组;3、判断过滤数组是否为空数组,如果为空则数组是索引数组。
2022-08-01 17:56:37 
摘要:步骤:1、定义一个空数组,用于存储一维数组的求和结果,语法“$s=[];”;2、用“foreach($arr as $k=>$v){//循环体}”循环遍历二维数组的外层元素;3、在循环体中,用is_array()判断外层元素是否为数组类型,如果是则用array_sum()计算该一维数组的元素和,语法“if(is_array($v)){$s[]=array_sum($v);}”。
2022-10-08 17:52:30 
摘要:在PHP中可以通过array_splice函数、array_replace函数和array_replace_recursive函数来进行对数组中的元素进行替换,下面我们就分别来看一下这三种函数的使用方法。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部