一:概念

既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(row,col,val,down,right),其中:

row:矩阵中的行。

col:矩阵中的列。

val:矩阵中的值。

right:指向右侧的一个非零元素。

down:指向下侧的一个非零元素。

现在我们知道单个节点该如何表示了,那么矩阵中同行的非零元素的表示不就是一个单链表吗?比如如下:

那么进一步来说一个多行的非零元素的表示不就是多个单链表吗,是的,这里我把单链表做成循环链表,我们来看看如何用十字链表来表示稀疏矩阵。

从上面的十字链表中要注意两个问题:

第一:这里有一个填充色的节点,是十字链表中的总结点,它是记录该矩阵中的(row,col,value)和一个指向下一个头节点的next指针。

第二:每个链表都有一个头指针,总结点用next指针将它们贯穿起来。

二、稀疏矩阵的创建过程

1、稀疏矩阵节点的定义

typedef struct OLNode {    int  i, j;          //行号与列号     ElemType e;        //值     struct OLNode *right, *down;  //指针域
}OLNode, *OList; 

2、为了创建稀疏矩阵,除了需要知道行数、列数和非零个数以外,还需要创建行头指针和列头指针,定义如下:

typedef struct {    OLink   *Rhead, *Chead;     int mu, nu, tu;       // 稀疏矩阵的行数、列数和非零元个数
}CrossList;    

3、稀疏矩阵的代码

int CreateSMatrix(CrossList *M)
{     int i, j, m, n, t;    int k, flag;    ElemType e;    OLNode *p, *q;    //输入稀疏矩阵的基本信息   if (M->Rhead)    DestroySMatrix(M); do {    flag = 1;    printf("输入需要创建的矩阵的行数、列数以及非零元的个数");    scanf("%d%d%d", &m, &n, &t);    if (m<0 || n<0 || t<0 || t>m*n)    flag = 0;    }while (!flag);    M->mu = m;    M->nu = n;    M->tu = t;    //创建行链表头数组     M->Rhead = (OLink *)malloc((m+1) * sizeof(OLink));    if(!M->Rhead)    exit(-1);    //创建列链表头数组     M->Chead = (OLink *)malloc((n+1) * sizeof(OLink));    if(!(M->Chead))    exit(-1);  for(k=1;k<=m;k++) // 初始化行头指针向量;各行链表为空链表      M->Rhead[k]=NULL;    for(k=1;k<=n;k++) // 初始化列头指针向量;各列链表为空链表      M->Chead[k]=NULL; //输入各个结点     for (k=1; k<=t; ++k)    {    do {    flag = 1;    printf("输入第%d个结点行号、列号以及值", k);    scanf("%d%d%d", &i, &j, &e);    if (i<=0 || j<=0)    flag = 0;    }while (!flag);  p = (OLink) malloc (sizeof(OLNode));    if (NULL == p)    exit(-1);    p->i = i;    p->j = j;    p->e = e;
//节点的行插入if(NULL==M->Rhead[i] || M->Rhead[i]->j>j)        //-----(1){    // p插在该行的第一个结点处     // M->Rhead[i]始终指向它的下一个结点     p->right = M->Rhead[i];    M->Rhead[i] = p;    }    else // 寻查在行表中的插入位置     {    //从该行的行链表头开始,直到找到     for(q=M->Rhead[i]; q->right && q->right->j < j; q=q->right) ; //----(2) p->right=q->right; // 完成行插入      q->right=p;    }
//节点的列插入if(NULL==M->Chead[j] || M->Chead[j]->i>i)     {    p->down = M->Chead[j];    M->Chead[j] = p;    }    else // 寻查在列表中的插入位置     {    //从该列的列链表头开始,直到找到     for(q=M->Chead[j]; q->down && q->down->i < i; q=q->down)     ;    p->down=q->down; // 完成行插入      q->down=p;    }    } return 1;
}  

4、代码的部分解释

(1)怎么去找到要插入的正确位置。当行中有结点的时候我们无非就是插入到某个结点之前或者之后。那么我们再回到前面,在我们定义Rhead的时候就说过,某一行的表头指针指向的就是该行中第一个结点的地址。我们假设该行中已经有了一个结点我们称它为A结点,如果要插在A结点之前那么A结点的列号必定是大于我们输入的结点(我们称它为P结点)的列号的。我们的插入操作就要修改头指针与p结点的right域。就像链表中的插入。那么当该行中没有结点的时候我们怎么去插入?同样是修改头指针让它指向我们的P结点,同样要修改P结点的right域。看,我们可以利用if语句来实现这两种条件的判断。

(2)重点关注:for循环后紧跟" ; ",

现在我们再想一下怎么去插入到某一个结点的后面? 我们新创建的P结点要插入到现有的A结点的后面,那么P的列号必定是大于A的列号,那么我们只要找到第一个大于比P的列号大的结点B,然后插入到B结点之前!如果现有的结点没有一个结点列号是大于P结点的列号的,那么我们就应该插入到最后一个结点之后!所以我们首先要寻找符合条件的位置进行插入  。

稀疏矩阵的创建--十字链表相关推荐

  1. noj数据结构稀疏矩阵的加法十字链表_数据结构学习(C )稀疏矩阵(十字链表1)

    CSDN 先说说什么叫稀疏矩阵. 你说, 这个问题很简单吗, 那你一定不知道中国学术界的嘴皮子仗, 对一个字眼的"抠"将会导致两种相反的结论.这是清华 2000 年的一道考研题:& ...

  2. noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...

    来源 | 异步 | 文末赠书 前段时间大火的国产游戏--<太吾绘卷>,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多 ...

  3. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  4. noj数据结构稀疏矩阵的加法十字链表_数据结构之:图

    导读 1. 什么是图?图的存储方式? 2. 图的遍历(深度优先搜索,广度优先搜索) 3. 最短路径 1. 什么是图?图的存储方式? 前面总结了"树"这种数据结构,而这篇博客总结的是 ...

  5. 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示

    typedef struct OLNode{ int  i,j;                 //该非零元的行列下标 ElemType    e; struct  OLNode    *right ...

  6. 稀疏矩阵——实现三元组,十字链表下的稀疏矩阵的加、转、乘的

    稀疏矩阵应用: 实现三元组,十字链表下的稀疏矩阵的加.转.乘. 代码: #include<iostream> using namespace std; typedef int ElemTy ...

  7. 稀疏矩阵的十字链表存储表示和实现(第五章 P104 算法5.4)

    稀疏矩阵的十字链表存储 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表.对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当. 在链表中,每个非零元 ...

  8. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  9. 第八周实践项目10 稀疏矩阵的十字链表表示

    #include <stdio.h> #include <malloc.h> #define M 3 //矩阵行 #define N 3 //矩阵列 #define Max ( ...

最新文章

  1. Socket通信实例
  2. 四线接近开关接线图_开关、电机、断路器、电热偶、电表接线图!非常齐全,快囤起来吧...
  3. java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列
  4. linux命令帮助怎么看,Linux命令帮助
  5. 一篇文章搞懂数据仓库:常用ETL工具、方法
  6. mysql group by 查询慢_MySQL慢查询优化(线上案例调优)
  7. 一文带你领略JS中原型链的精妙设计
  8. mysql服务器 配置文件,服务器上mysql编码配置文件
  9. 引用计数和AddRef、Release
  10. 微软威胁情报中心总经理 John Lambert 谈安全
  11. 高校成绩管理数据库系统
  12. Nike Zoom KD 5 “OKC / Away” colorway
  13. txt 文本文档中空格替换
  14. bose qc25更换耳机单元
  15. 3dmax2014 uv用法_3ds max uv展开教程
  16. 拍视频到底用手机还是相机好?
  17. c语言数码管显示小数点,8位数码管显示正整数和小数及解决鬼影问题
  18. vue+element弹窗可拖拽拉伸和弹窗内table高度自适应
  19. L2-3 清点代码库 (25 分)
  20. 应用程序中的服务器错误 怎么解决办法,iwms出现“/”应用程序中的服务器错误。解决办法...

热门文章

  1. 实验一 Linux开发环境的配置 20145213祁玮 20145222黄亚奇
  2. Lily:基于Solr、HBase、Zookeeper云计算上的内容仓库
  3. python修改zabbix中的ip
  4. Windows终端(WT)添加conda命令行
  5. mysql 常用操作(整理)
  6. ajax json 渲染 html,jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
  7. 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)
  8. Mac 上制作 SSL 证书
  9. java drawpolygon_Java如何绘制和填充有孔的Polygon
  10. 用 Windows Live Writer [最新版本] 发布 51CTO 博客