十字链表的构成
用链表模拟矩阵的行(或者列,这可以根据个人喜好来定),然后,再构造代表列的链表,将每一行中的元素节点插入到对应的列中去。十字链表的逻辑结构就像是一个围棋盘(没见过,你就想一下苍蝇拍,这个总见过吧),而非零元就好像是在棋盘上放的棋子,总共占的空间就是,确定那些线的表头节点和那些棋子代表的非零元节点。最后,我们用一个指针指向这个棋盘,这个指针就代表了这个稀疏矩阵。
十字链表
十字链表(Orthogonal List)是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应于有向图中每一条弧都有一个结点,对应于每个定顶点也有一个结点。
十字链表之于有向图,类似于邻接表之于无向图。十字链表主要在两个地方应用:稀疏矩阵的存储, 有向图的存储。
实现
C代码如下:
#include <malloc.h>
#include <stdio.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 CreateCrossList(CrossList *M)
{
int m, n, t;
int i, j, e;
OLNode* p;
OLNode* q;
//采用十字链表存储结构,创建稀疏矩阵M
scanf("%d%d%d", &m, &n, &t);
M->m = m;
M->n = n;
M->len = t;
if(!(M->row_head=(OLink*)malloc((m+1)*sizeof(OLink))))
{
printf("Error\n");
}
if(!(M->col_head=(OLink*)malloc((n+1)*sizeof(OLink))))
{
printf("Error\n");
}
//初始化行头指针向量,各行链表为空的链表
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;
}
for(scanf("%d%d%d", &i, &j, &e); i!=0; scanf("%d%d%d",&i, &j, &e))
{
if(!(p = (OLNode*)malloc(sizeof(OLNode))))
{
printf("Error\n");
}
//生成节点
p->row = i;
p->col = j;
p->value = e;
if(M->row_head[i] == NULL)
{
M->row_head[i] = p;
}
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;
}
else
{
//寻找列表中的插入位置
for(q=M->col_head[j]; q->down && q->down->row < i; q=q->down);
p->down = q->down;
q->down = p;
}
}
}
分享到:
相关推荐
十字链表存储作为稀疏矩阵的一种高效存储方式,能够充分利用矩阵的稀疏特性,有效压缩存储空间,同时在一定程度上保持数据处理的灵活性和效率。 在讨论稀疏矩阵的十字链表存储方法前,我们首先需要了解何为稀疏矩阵...
十字链表实现稀疏矩阵的加法 稀疏矩阵是一种特殊的矩阵,其中大多数元素为零,而非零元素稀疏分布在矩阵之中。为了高效地存储和操作稀疏矩阵,十字链表是一种常用的存储结构。十字链表是一种链式存储结构,每个非零...
十字链表是一种特殊的链表结构,它在二维空间中组织数据,通常用于表示稀疏矩阵。在MFC(Microsoft Foundation Classes)环境下,十字链表可以被用来高效地管理内存和处理大量的数据。本文将深入探讨十字链表的概念...
在`main`函数中,程序依次调用了上述各函数,先读取文件,然后打印原始的十字链表,执行转置操作,再次打印转置后的十字链表,并将结果写入新文件。 总结来说,这个C++程序展示了如何利用十字链表有效地处理稀疏...
十字链表,也被称为正交链表或二维链表,是一种高级的数据结构,它扩展了传统的线性链表,使其能够在二维空间中表示数据。在十字链表中,每个节点不仅包含指向相邻节点的指针,还包含了指向其对角线上的节点的指针,...
【十字链表创建的实验报告】 十字链表是一种特殊的链表结构,主要用于高效地存储稀疏矩阵。在计算机科学中,稀疏矩阵是指大部分元素为零的矩阵,使用十字链表可以节省大量的存储空间,因为它只存储非零元素。本实验...
本次课程设计的主题是“十字链表”,这是一种专门用于二维数组,例如矩阵,的数据结构。十字链表可以方便地表示矩阵的非零元素,对于进行矩阵运算如加、减、乘、转置和求逆等具有显著优势。 首先,我们需要理解十字...
十字链表是一种高级的数据结构,它扩展了传统的线性链表,使得数据可以在四个方向上进行链接,类似于棋盘上的十字形布局。这种数据结构在处理二维数组或矩阵时特别有用,因为它允许快速访问和操作相邻元素。在C++中...
十字链表是一种特殊的链式数据结构,主要用于二维数组或矩阵的存储。在C语言中实现十字链表,需要理解链表的基本概念,并扩展到多维度的链接方式。本篇文章将详细探讨C语言实现十字链表的相关知识点。 首先,我们要...
### 数据结构6.5图的存储之三:十字链表 #### 一、引言 在数据结构的学习中,图是一种非常重要的非线性数据结构,用于表示对象及其之间的关系。图的存储方式多种多样,其中较为常见的包括邻接矩阵、邻接表等。而...
十字链表矩阵加法typedef struct { int i,j; int e; }triple; typedef struct { triple data[MAXSIZE+1];//data[0]未用,下表从1开始,与三元组的位置对应 int mu,nu,tu;//矩阵的行、列数和非零元个数 }tsmatrix...
由于存储和处理大量的零元素会浪费大量空间,因此对于稀疏矩阵,通常采用更高效的存储结构,比如三元组表示法和十字链表表示法。 **三元组表示法**: 三元组(Triplet)是稀疏矩阵的一种存储方式,它通过三个关键...
### C语言实现十字链表 #### 背景与意义 在C语言的学习与应用过程中,数据结构扮演着至关重要的角色。其中,链表作为基本且实用的数据结构之一,在实际编程中有着广泛的应用场景。当涉及到较为复杂的数据处理任务...
十字链表双重索引算法是一种高效的数据结构设计,主要用于处理大量数据并提高查询效率,尤其在日志分析等场景中非常适用。系统日志通常包含大量的重复信息,使用这种算法可以有效地抑制重复日志,避免资源浪费,提高...
### 十字链表稀疏矩阵相加知识点详解 #### 一、背景介绍 稀疏矩阵是指矩阵中大部分元素为零或几乎为零的矩阵。这类矩阵在实际应用中非常常见,例如在图像处理、机器学习等领域都有广泛的应用。由于稀疏矩阵中非零...
《稀疏矩阵乘法运算的十字链表实现》 本课程设计的主要目标是实现稀疏矩阵的乘法运算,并将其应用于实际问题中。稀疏矩阵是一种特殊的矩阵,其中大多数元素为零。因此,在存储和计算时可以大大节省存储空间,提高...
《基于二维数组和十字链表的Apriori算法 (1) 数组和链表》这篇论文探讨了在数据挖掘领域中的关联规则挖掘问题,特别是针对Apriori算法的一种优化实现。Apriori算法是一种经典的频繁项集挖掘算法,用于发现数据库中项...
十字链表是一种常见的稀疏矩阵存储方式,尤其适用于表示非零元素分布不均匀的情况。本问题主要讨论如何使用十字链表来存储稀疏矩阵,并实现两个稀疏矩阵的乘法运算。 首先,我们来看十字链表的结构。十字链表由两...
### 基于二维数组和十字链表的Apriori算法 #### 一、引言 Apriori算法是一种广泛应用于数据挖掘领域的经典算法,主要用于发现频繁项集和关联规则。传统的Apriori算法虽然简单易懂,但在处理大规模数据集时存在两个...
结构 十字链表 矩阵 相加 定义结构都是书上的 就是个求和没有 自己写的