稀疏矩阵的创建--十字链表
一:概念
既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下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结点的列号的,那么我们就应该插入到最后一个结点之后!所以我们首先要寻找符合条件的位置进行插入 。
稀疏矩阵的创建--十字链表相关推荐
- noj数据结构稀疏矩阵的加法十字链表_数据结构学习(C )稀疏矩阵(十字链表1)
CSDN 先说说什么叫稀疏矩阵. 你说, 这个问题很简单吗, 那你一定不知道中国学术界的嘴皮子仗, 对一个字眼的"抠"将会导致两种相反的结论.这是清华 2000 年的一道考研题:& ...
- noj数据结构稀疏矩阵的加法十字链表_一个算法毁了一款好游戏?算法和数据结构到底有多重要?...
来源 | 异步 | 文末赠书 前段时间大火的国产游戏--<太吾绘卷>,由于创新的玩法和精良的制作一度广受好评,然而随着玩家游戏的深入和时长的积累,发现该游戏在玩的过程中游戏外的问题很多很多 ...
- 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维
----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...
- noj数据结构稀疏矩阵的加法十字链表_数据结构之:图
导读 1. 什么是图?图的存储方式? 2. 图的遍历(深度优先搜索,广度优先搜索) 3. 最短路径 1. 什么是图?图的存储方式? 前面总结了"树"这种数据结构,而这篇博客总结的是 ...
- 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
typedef struct OLNode{ int i,j; //该非零元的行列下标 ElemType e; struct OLNode *right ...
- 稀疏矩阵——实现三元组,十字链表下的稀疏矩阵的加、转、乘的
稀疏矩阵应用: 实现三元组,十字链表下的稀疏矩阵的加.转.乘. 代码: #include<iostream> using namespace std; typedef int ElemTy ...
- 稀疏矩阵的十字链表存储表示和实现(第五章 P104 算法5.4)
稀疏矩阵的十字链表存储 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表.对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当. 在链表中,每个非零元 ...
- 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)
特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...
- 第八周实践项目10 稀疏矩阵的十字链表表示
#include <stdio.h> #include <malloc.h> #define M 3 //矩阵行 #define N 3 //矩阵列 #define Max ( ...
最新文章
- Socket通信实例
- 四线接近开关接线图_开关、电机、断路器、电热偶、电表接线图!非常齐全,快囤起来吧...
- java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列
- linux命令帮助怎么看,Linux命令帮助
- 一篇文章搞懂数据仓库:常用ETL工具、方法
- mysql group by 查询慢_MySQL慢查询优化(线上案例调优)
- 一文带你领略JS中原型链的精妙设计
- mysql服务器 配置文件,服务器上mysql编码配置文件
- 引用计数和AddRef、Release
- 微软威胁情报中心总经理 John Lambert 谈安全
- 高校成绩管理数据库系统
- Nike Zoom KD 5 “OKC / Away” colorway
- txt 文本文档中空格替换
- bose qc25更换耳机单元
- 3dmax2014 uv用法_3ds max uv展开教程
- 拍视频到底用手机还是相机好?
- c语言数码管显示小数点,8位数码管显示正整数和小数及解决鬼影问题
- vue+element弹窗可拖拽拉伸和弹窗内table高度自适应
- L2-3 清点代码库 (25 分)
- 应用程序中的服务器错误 怎么解决办法,iwms出现“/”应用程序中的服务器错误。解决办法...
热门文章
- 实验一 Linux开发环境的配置 20145213祁玮 20145222黄亚奇
- Lily:基于Solr、HBase、Zookeeper云计算上的内容仓库
- python修改zabbix中的ip
- Windows终端(WT)添加conda命令行
- mysql 常用操作(整理)
- ajax json 渲染 html,jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
- 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)
- Mac 上制作 SSL 证书
- java drawpolygon_Java如何绘制和填充有孔的Polygon
- 用 Windows Live Writer [最新版本] 发布 51CTO 博客