稀疏矩阵运算器
一、需求分析
1、稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。
2、以“带行逻辑链接信息’的三元组顺序表示稀疏矩阵,实现两个矩阵相加,相减和相乘的运算,稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
3、首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行,列数对于所要求作的运算是否匹配,可设矩阵的行数和列数均不超过20。程序可以对三元组的输入顺序加以限制,例如,按行优先。在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放。
4、测试数据
二、详细代码
#include<iostream>
using namespace std;
struct olnode {
int i, j; //行,列
double e; //元素值
olnode *right, *down;
};
struct crosslist {
//十字链表
olnode **rhead, **chead;//r行指针,c列
int mu, nu, tu; //行数 列数 非零元素数
};
int creatlist(crosslist &M) {
//初始化十字链表
int m, n, t;
cout << "依次输入行,列,元素数目" << endl;
while (!(cin >> m >> n >> t) || m <= 0 || n <= 0 || t<0||(m*n)<t||m>20||n>20) {
cout << "error" << endl;
cin.clear();
cin.ignore();
}
M.mu = m;
M.nu = n;
M.tu = t;
M.rhead = new olnode *[m + 1];
M.chead = new olnode *[n + 1];
for (int i = 0; i <= M.mu; i++)
M.rhead[i] = NULL;
for (int i = 0; i <= M.nu; i++)
M.chead[i] = NULL;
return t;
}
void creatlist1(crosslist &M, int a, int b) {
//创建新矩阵
M.mu = a;
M.nu = b;
M.tu = 0;
M.rhead = new olnode *[a + 1];
M.chead = new olnode *[b + 1];
for (int i = 0; i <= M.mu; i++)
M.rhead[i] = NULL;
for (int i = 0; i <= M.nu; i++)
M.chead[i] = NULL;
}
int check(crosslist M, int a, int b) {
//检查是否重复插入元素
olnode *p = M.rhead[a];
olnode *q = M.chead[b];
int l1 = 0, l2 = 0;
if (M.rhead[a] == NULL || M.chead[b] == NULL) return 1;
if (p->j == b) return 0;
else{
while (p->j != b && p->right != NULL) {
p = p->right;
if (p->j == b