对于压缩存储稀疏矩阵,无论是使用

图 1 十字链表示意图

可以看到,使用十字链表压缩存储稀疏矩阵时,矩阵中的各行各列都各用一各链表存储,与此同时,所有行链表的表头存储到一个数组(rhead),所有列链表的表头存储到另一个数组(chead)中。

因此,各个链表中节点的结构应如图 2 所示:

图 2 十字链表的节点结构

两个指针域分别用于链接所在行的下一个元素以及所在列的下一个元素。

链表中节点的 C 语言代码表示应为:

typedef struct OLNode{

int i,j;//元素的行标和列标

int data;//元素的值

struct OLNode * right,*down;//两个指针域

}OLNode;

同时,表示十字链表结构的 C 语言代码应为:

#include

#include

typedef struct OLNode

{

int i, j, e; //矩阵三元组i代表行 j代表列 e代表当前位置的数据

struct OLNode *right, *down; //指针域 右指针 下指针

}OLNode, *OLink;

typedef struct

{

OLink *rhead, *chead; //行和列链表头指针

int mu, nu, tu; //矩阵的行数,列数和非零元的个数

}CrossList;

CrossList CreateMatrix_OL(CrossList M);

void display(CrossList M);

int main()

{

CrossList M;

M.rhead = NULL;

M.chead = NULL;

M = CreateMatrix_OL(M);

printf("输出矩阵M:\n");

display(M);

return 0;

}

CrossList CreateMatrix_OL(CrossList M)

{

int m, n, t;

int i, j, e;

OLNode *p, *q;

printf("输入矩阵的行数、列数和非0元素个数:");

scanf("%d%d%d", &m, &n, &t);

M.mu = m;

M.nu = n;

M.tu = t;

if (!(M.rhead = (OLink*)malloc((m + 1) * sizeof(OLink))) || !(M.chead = (OLink*)malloc((n + 1) * sizeof(OLink))))

{

printf("初始化矩阵失败");

exit(0);

}

for (i = 1; i <= m; i++)

{

M.rhead[i] = NULL;

}

for (j = 1; j <= n; j++)

{

M.chead[j] = NULL;

}

for (scanf("%d%d%d", &i, &j, &e); 0 != i; scanf("%d%d%d", &i, &j, &e)) {

if (!(p = (OLNode*)malloc(sizeof(OLNode))))

{

printf("初始化三元组失败");

exit(0);

}

p->i = i;

p->j = j;

p->e = e;

//链接到行的指定位置

if (NULL == M.rhead[i] || M.rhead[i]->j > j)

{

p->right = M.rhead[i];

M.rhead[i] = p;

}

else

{

for (q = M.rhead[i]; (q->right) && q->right->j < j; q = q->right);

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 M;

}

void display(CrossList M) {

for (int i = 1; i <= M.nu; i++)

{

if (NULL != M.chead[i])

{

OLink p = M.chead[i];

while (NULL != p)

{

printf("%d\t%d\t%d\n", p->i, p->j, p->e);

p = p->down;

}

}

}

}

运行结果:

输入矩阵的行数、列数和非0元素个数:3 3 3

2 2 3

2 3 4

3 2 5

0 0 0

输出矩阵M:

2       2       3

3       2       5

2       3       4

十字链表表示矩阵c语言,十字链表法,十字链表压缩存储稀疏矩阵详解相关推荐

  1. 十字链表 java_十字链表法,十字链表压缩存储稀疏矩阵详解

    对于压缩存储稀疏矩阵,无论是使用三元组顺序表,还是使用行逻辑链接的顺序表,归根结底是使用数组存储稀疏矩阵.介于数组 "不利于插入和删除数据" 的特点,以上两种压缩存储方式都不适合解 ...

  2. 十字链表法,十字链表压缩存储稀疏矩阵详解

    对于压缩存储稀疏矩阵,无论是使用三元组顺序表,还是使用行逻辑链接的顺序表,归根结底是使用数组存储稀疏矩阵.介于数组 "不利于插入和删除数据" 的特点,以上两种压缩存储方式都不适合解 ...

  3. 电大计算机C语言1253,1253《C语言程序设计》电大期末精彩试题及其问题详解

    1253<C语言程序设计>电大期末精彩试题及其问题详解 (34页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档&l ...

  4. 单链表折半查找c语言,为什么有序的单链表不能进行折半查找

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:为什么有序的单链表不能进行折半查找 问题详情:急!!!!拜托高手解答 等级低 分数不高 请帮帮忙 谢谢了回答:这是由链表的特决定的. ...

  5. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  6. 矩阵-----对称矩阵及其压缩存储稀疏矩阵

    什么是对称矩阵(SymmetricMatrix)? 对称对称-------看 设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 & ...

  7. c语言1e3和1e3,自考“高级语言程序设计”习题答案详解(33)

    6.1 单项选择题 1.函数调用语句"f((el,e2),(e3,e4,e5)):"中参数的个数是( ) ①1 ②2 ③4 ④5 「解」上述函数调用中,(e1,e2)和(e3,e4 ...

  8. C语言 程序的翻译 预处理 编译 汇编 链接 #define详解

    1.程序的翻译环境和执行环境 执行环境:所在操作系统的平台 win10 win11 linux 翻译环境:MSVC gcc g++ 你的vs 2019 和2022 是集成开发环境把编辑器编译器全部给你 ...

  9. c语言整型数据类型及存储形式详解

    c语言基本数据类型 整型 基本整型(int) 短整型(short int) 长整型(long int) *双长整型(long long int) 字符型(char) 布尔型(bool) 无符号型详解 ...

  10. c语言中用来指示文件缓冲区中具体读写位置,C语言文件读写操作中缓冲区问题和setbuf函数详解...

    清除和设置文件缓冲区 (1).清除文件缓冲区函数: int fflush(FILE *stream); int flushall(); fflush()函数将清除由stream指向的文件缓冲区里的内容 ...

最新文章

  1. android130 android启动
  2. linux小工具(2)终端记录器script命令
  3. Electron中通过net的API发出HTTP请求
  4. IdentityServer4实战 - 基于角色的权限控制及Claim详解
  5. 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...
  6. 在一个递增有序链表中插入新结点并保持链表递增顺序不变
  7. JXL读取,写入Excel
  8. SpringBoot+Ajax文件上传+FormData表单提交
  9. IE 8 HTML Parsing Error:Unable to modify the parent container element before the child element is...
  10. 计算机界面视频录制软件,怎么进行电脑界面上的画面录制,推荐下好用的电脑录屏软件呗...
  11. 根据视频链接并下载视频(mp4格式)
  12. ObjectiveC开发教程--如何判断字符串是否为空的方法
  13. 1人工智能概述------人工智能发展历程(人工智能的起源、人工智能的发展经历了六个阶段)
  14. 漏洞四处,苹果电脑也不再安全?(转)
  15. android画图奥运五环,Android 自定义View 画圆(奥运五环)
  16. Codeforces D. Berserk And Fireball(贪心)
  17. 什么是高斯模糊算法?
  18. RDD转换为DataFrame的两种方式详解
  19. 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++
  20. ansible-playbook批量部署Zabbix

热门文章

  1. mySQL及可视化界面navicat在window的配置
  2. 数据结构-栈操作-用链表实现栈基本操作
  3. 普林斯顿微积分读本-[美]阿德里安·班纳著-修订版;杨爽, 赵晓婷, 高璞译
  4. RTP载荷H264视频流
  5. CSDN账号被盗了吗?
  6. win7锁定桌面计算机图标,Win7锁定桌面图标的详细步骤(图文)
  7. 删除excel 2007数据透视表
  8. 光立方程序详解_C ++程序使用宏查找数字的立方
  9. Delphi实现文件下载UrlDownloadToFile
  10. oracle数据库下载地址