C语言数据结构创建及遍历十字链表

 更新时间:2021年10月15日 16:17:08   作者:挥刀五百下  
这篇文章主要介绍了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语言数据结构的资料请关注脚本之家其它相关文章!

相关文章

  • 老生常谈C语言动态函数库的制作和使用(推荐)

    老生常谈C语言动态函数库的制作和使用(推荐)

    下面小编就为大家带来一篇老生常谈C语言动态函数库的制作和使用(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • C语言实现贪吃蛇游戏演示

    C语言实现贪吃蛇游戏演示

    这篇文章主要为大家详细介绍了C语言实现贪吃蛇游戏演示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C语言实现数字游戏

    C语言实现数字游戏

    这篇文章主要为大家详细介绍了C语言实现数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • 探讨register关键字在c语言和c++中的差异

    探讨register关键字在c语言和c++中的差异

    建议不要用register关键字定义全局变量,因为全局变量的生命周期是从执行程序开始,一直到程序结束才会终止,而register变量可能会存放在cpu的寄存器中,如果在程序的整个生命周期内都占用着寄存器的话,这是个相当不好的举措
    2013-10-10
  • C语言的循环小练习详解

    C语言的循环小练习详解

    这篇文章主要为大家介绍了C语言的循环小练习,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Qt使用SQLite数据库存储管理图片文件

    Qt使用SQLite数据库存储管理图片文件

    这篇文章主要为大家详细介绍了Qt如何使用SQLite数据库实现存储管理图片文件的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-04-04
  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器

    函数指针是一个指针变量,它可以存储函数的地址,然后使用函数指针,下面这篇文章主要给大家介绍了关于C语言用函数指针实现计算器的方法,需要的朋友可以参考下
    2022-07-07
  • C语言 auto和register关键字

    C语言 auto和register关键字

    这篇文章主要介绍了C语言 auto、register关键字,文章通过变量展开全文相关的详细内容,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • C语言详细讲解strcpy strcat strcmp函数的模拟实现

    C语言详细讲解strcpy strcat strcmp函数的模拟实现

    这篇文章主要介绍了怎样用C语言模拟实现strcpy与strcat和strcmp函数,strcpy()函数是C语言中的一个复制字符串的库函数,strcat()函数的功能是实现字符串的拼接,strcmp()函数作用是比较字符串str1和str2是否相同
    2022-05-05
  • C语言中对字母进行大小写转换的简单方法

    C语言中对字母进行大小写转换的简单方法

    这篇文章主要介绍了C语言中对字母进行大小写转换的简单方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08

最新评论