解题思路:
这道题要求用十字链表的储存结构储存稀疏矩阵,并进行加法运算。
首先我们要了解一下为什么要用十字链表,对于一个稀疏矩阵,尤其是高维度时,如果以多维数组的形式开辟空间,会造成很大的不必要空间浪费,于是我们用十字链表,只存储稀疏矩阵中的非零元素,来达到储存稀疏矩阵的目的。
当要进行矩阵的加、减、乘等运算时,有时非零元素的位置会发生很大的变化,三元组表为保持以行或列序为主而需要大量移动元素。但十字链表就比较灵活,它在三元组表的基础之上多了两个指针域,指向同一行中的下一个非零元素和同一列的下一个非零元素。
常见的十字链表节点和十字链表的宏定义如下:
typedef struct OLNode{
//定义十字链表结点
int i,j;
int val;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct{
//定义十字链表
OLink *rhead,*chead;//定义行和列的头指针地址组
int mu,nu,tu;
}CrossList;
本题的难点对十字链表进行各种操作时的逻辑与算法,十字链表虽然相比三元组表在储存矩阵上有一定优势,但其在结构与算法上还是比较复杂的。
具体操作见代码,代码中有部分注释。
题解代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct OLNode{
//定义十字链表结点
int i,j;
int val;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct{
//定义十字链表
OLink *rhead,*chead;//定义行和列的头指针地址组
int mu,nu,tu;
}CrossList;
void CreatMatrix_OL(CrossList *M, int m, int n, int t){
//创建一个m行n列容量为t的十字链表
//初始化M头节点,行、列和容量信息,开辟行列链表头节点空间
M->rhead = M->chead = NULL;
M->mu = m;
M->nu = n;
M->tu = t;
M->rhead = (OLink*)malloc(sizeof(OLink)*(m+1));
M->chead = (OLink*)malloc(sizeof(OLink)*(n