`
Riddick
  • 浏览: 640337 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

十字链表

J# 
阅读更多

十字链表的构成

用链表模拟矩阵的行(或者列,这可以根据个人喜好来定),然后,再构造代表列的链表,将每一行中的元素节点插入到对应的列中去。十字链表的逻辑结构就像是一个围棋盘(没见过,你就想一下苍蝇拍,这个总见过吧),而非零元就好像是在棋盘上放的棋子,总共占的空间就是,确定那些线的表头节点和那些棋子代表的非零元节点。最后,我们用一个指针指向这个棋盘,这个指针就代表了这个稀疏矩阵。

十字链表

十字链表(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

    十字链表是一种特殊的链表结构,它在二维空间中组织数据,通常用于表示稀疏矩阵。在MFC(Microsoft Foundation Classes)环境下,十字链表可以被用来高效地管理内存和处理大量的数据。本文将深入探讨十字链表的概念...

    基于十字链表存储的稀疏矩阵的转置

    在`main`函数中,程序依次调用了上述各函数,先读取文件,然后打印原始的十字链表,执行转置操作,再次打印转置后的十字链表,并将结果写入新文件。 总结来说,这个C++程序展示了如何利用十字链表有效地处理稀疏...

    十字链表数据结构

    十字链表,也被称为正交链表或二维链表,是一种高级的数据结构,它扩展了传统的线性链表,使其能够在二维空间中表示数据。在十字链表中,每个节点不仅包含指向相邻节点的指针,还包含了指向其对角线上的节点的指针,...

    十字链表创建的实验报告

    【十字链表创建的实验报告】 十字链表是一种特殊的链表结构,主要用于高效地存储稀疏矩阵。在计算机科学中,稀疏矩阵是指大部分元素为零的矩阵,使用十字链表可以节省大量的存储空间,因为它只存储非零元素。本实验...

    c++数据结构课程设计_十字链表

    本次课程设计的主题是“十字链表”,这是一种专门用于二维数组,例如矩阵,的数据结构。十字链表可以方便地表示矩阵的非零元素,对于进行矩阵运算如加、减、乘、转置和求逆等具有显著优势。 首先,我们需要理解十字...

    C++语言 十字链表

    十字链表是一种高级的数据结构,它扩展了传统的线性链表,使得数据可以在四个方向上进行链接,类似于棋盘上的十字形布局。这种数据结构在处理二维数组或矩阵时特别有用,因为它允许快速访问和操作相邻元素。在C++中...

    C语言实现十字链表 数据结构

    十字链表是一种特殊的链式数据结构,主要用于二维数组或矩阵的存储。在C语言中实现十字链表,需要理解链表的基本概念,并扩展到多维度的链接方式。本篇文章将详细探讨C语言实现十字链表的相关知识点。 首先,我们要...

    数据结构6.5图的存储之三:十字链表

    ### 数据结构6.5图的存储之三:十字链表 #### 一、引言 在数据结构的学习中,图是一种非常重要的非线性数据结构,用于表示对象及其之间的关系。图的存储方式多种多样,其中较为常见的包括邻接矩阵、邻接表等。而...

    矩阵的加法、乘法、 转置。c,三元组,十字链表

    十字链表矩阵加法typedef struct { int i,j; int e; }triple; typedef struct { triple data[MAXSIZE+1];//data[0]未用,下表从1开始,与三元组的位置对应 int mu,nu,tu;//矩阵的行、列数和非零元个数 }tsmatrix...

    三元组和十字链表表示法1

    由于存储和处理大量的零元素会浪费大量空间,因此对于稀疏矩阵,通常采用更高效的存储结构,比如三元组表示法和十字链表表示法。 **三元组表示法**: 三元组(Triplet)是稀疏矩阵的一种存储方式,它通过三个关键...

    C语言实现十字链表

    ### C语言实现十字链表 #### 背景与意义 在C语言的学习与应用过程中,数据结构扮演着至关重要的角色。其中,链表作为基本且实用的数据结构之一,在实际编程中有着广泛的应用场景。当涉及到较为复杂的数据处理任务...

    十字链表双重索引算法

    十字链表双重索引算法是一种高效的数据结构设计,主要用于处理大量数据并提高查询效率,尤其在日志分析等场景中非常适用。系统日志通常包含大量的重复信息,使用这种算法可以有效地抑制重复日志,避免资源浪费,提高...

    十字链表稀疏矩阵相加

    ### 十字链表稀疏矩阵相加知识点详解 #### 一、背景介绍 稀疏矩阵是指矩阵中大部分元素为零或几乎为零的矩阵。这类矩阵在实际应用中非常常见,例如在图像处理、机器学习等领域都有广泛的应用。由于稀疏矩阵中非零...

    数据结构课程设计《稀疏矩阵乘法运算的十字链表实现》

    《稀疏矩阵乘法运算的十字链表实现》 本课程设计的主要目标是实现稀疏矩阵的乘法运算,并将其应用于实际问题中。稀疏矩阵是一种特殊的矩阵,其中大多数元素为零。因此,在存储和计算时可以大大节省存储空间,提高...

    基于二维数组和十字链表的Apriori算法 (1) 数组和链表.pdf

    《基于二维数组和十字链表的Apriori算法 (1) 数组和链表》这篇论文探讨了在数据挖掘领域中的关联规则挖掘问题,特别是针对Apriori算法的一种优化实现。Apriori算法是一种经典的频繁项集挖掘算法,用于发现数据库中项...

    十字链表存储稀疏矩阵算法(乘法)

    十字链表是一种常见的稀疏矩阵存储方式,尤其适用于表示非零元素分布不均匀的情况。本问题主要讨论如何使用十字链表来存储稀疏矩阵,并实现两个稀疏矩阵的乘法运算。 首先,我们来看十字链表的结构。十字链表由两...

    基于二维数组和十字链表的Apriori算法 数组和链表.docx

    ### 基于二维数组和十字链表的Apriori算法 #### 一、引言 Apriori算法是一种广泛应用于数据挖掘领域的经典算法,主要用于发现频繁项集和关联规则。传统的Apriori算法虽然简单易懂,但在处理大规模数据集时存在两个...

    基于二维数组和十字链表的Apriori算法 数组和链表(02).pdf

    《基于二维数组和十字链表的Apriori算法》 Apriori算法是关联规则挖掘中的基础方法,由Agrawal于1993年提出。它的主要目标是从大量事务数据库中找出频繁项集,这些频繁项集反映了不同项之间的频繁共现关系,从而...

Global site tag (gtag.js) - Google Analytics