数据结构--稀疏矩阵

最近事情比较多,匆忙写出来应付检查的代码。

写的既不优雅,又没效率 ,还有大面积的代码重复[没脸见人]

  1 #include <iostream>
  2 #include <cstdio>
  3 using namespace std;
  4
  5 const int MAXSIZE = 401;
  6 class Triple {
  7 public:
  8     int i, j, value;
  9     Triple(int ai, int aj, int avalue) {
 10         i = ai;
 11         j = aj;
 12         value = avalue;
 13     }
 14 };
 15 class Matrix {
 16 public:
 17     Triple *data[MAXSIZE] = { nullptr };
 18     int row, column;
 19     int currentSize = 0;
 20     int isExist(int i, int j) {
 21         int begin = 1;
 22         while (data[begin] != nullptr) {
 23             if (data[begin]->i == i && data[begin]->j == j) {
 24                 return begin;
 25             }
 26             begin++;
 27         }
 28         return -1;
 29     }
 30     void append(int i, int j, int value) {
 31         int location = isExist(i, j);
 32         if (location == -1) {
 33             currentSize++;
 34             data[currentSize] = new Triple(i, j, value);
 35         }
 36         else {
 37             data[location]->value += value;
 38         }
 39     }
 40     int getValue(int i, int j) {
 41         int location = isExist(i, j);
 42         if (location == -1) {
 43             return 0;
 44         }
 45         else {
 46             return data[location]->value;
 47         };
 48     }
 49 };
 50 int main()
 51 {
 52     Matrix a, b, c;
 53     int m, s, n, v;
 54
 55     cout << "进行矩阵乘法运算 m*s s*n 输入m s n" <<
 56         "进行矩阵加法计算 m*n 输入 m n 0" <<
 57         "进行矩阵减法计算 m*n 输入 m n -1" << endl;
 58     scanf("%d %d %d", &m, &s, &n);
 59
 60
 61
 62     if (n > 0) {    //乘法
 63         for (int i = 0; i < m; i++) {
 64             for (int j = 0; j < s; j++) {
 65                 scanf("%d", &v);
 66                 a.append(i, j, v);
 67             }
 68         }
 69         cout << "martix 1 completed" << endl;
 70
 71         for (int i = 0; i < s; i++) {
 72             for (int j = 0; j < n; j++) {
 73                 scanf("%d", &v);
 74                 b.append(i, j, v);
 75             }
 76         }
 77         cout << "martix 2 completed" << endl;
 78
 79         for (int i = 0; i < m; i++) {
 80             for (int j = 0; j < n; j++) {
 81                 for (int z = 0; z < s; z++) {
 82                     c.append(i, j, a.getValue(i, z) * b.getValue(z, j));
 83                 }
 84             }
 85         }
 86     }
 87     else if (n == 0) {
 88         for (int i = 0; i < m; i++) {
 89             for (int j = 0; j < s; j++) {
 90                 scanf("%d", &v);
 91                 a.append(i, j, v);
 92             }
 93         }
 94         cout << "martix 1 completed" << endl;
 95
 96         for (int i = 0; i < m; i++) {
 97             for (int j = 0; j < s; j++) {
 98                 scanf("%d", &v);
 99                 b.append(i, j, v);
100             }
101         }
102         cout << "martix 2 completed" << endl;
103
104         for (int i = 0; i < m; i++) {
105             for (int j = 0; j < s; j++) {
106                     c.append(i, j, a.getValue(i, j) + b.getValue(i, j));
107             }
108         }
109     }
110     else if (n < 0) {
111         for (int i = 0; i < m; i++) {
112             for (int j = 0; j < s; j++) {
113                 scanf("%d", &v);
114                 a.append(i, j, v);
115             }
116         }
117         cout << "martix 1 completed" << endl;
118
119         for (int i = 0; i < m; i++) {
120             for (int j = 0; j < s; j++) {
121                 scanf("%d", &v);
122                 b.append(i, j, v);
123             }
124         }
125         cout << "martix 2 completed" << endl;
126
127         for (int i = 0; i < m; i++) {
128             for (int j = 0; j < s; j++) {
129                     c.append(i, j, a.getValue(i, j) - b.getValue(i, j));
130             }
131         }
132     }
133
134     int p2c = 1;
135     for (int i = 0; i < m; i++) {
136         for (int j = 0; j < s; j++) {
137             cout << c.getValue(i, j) << " ";
138         }
139         cout << endl;
140     }
141     return 0;
142 }

原文地址:https://www.cnblogs.com/BD1A489/p/9996718.html

时间: 2024-10-17 08:44:46

数据结构--稀疏矩阵的相关文章

javascript实现数据结构: 稀疏矩阵之三元组线性表表示

稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设  δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦0.05时称为稀疏矩阵, 稀疏矩阵的压缩存储 对于稀疏矩阵,采用压缩存储方法时,只存储非0元素.必须存储非0元素的行下标值.列下标值.元素值.因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素. 上图的稀疏矩阵A的三元组线性表为: ( (1,2,12), (1,3,9), (3,1

数据结构——稀疏矩阵

在普遍的印象中,矩阵是由方括号围住,同时各个坐标的数字整齐的排列着.如下图所示: 看到图示后,第一反应当然是用一个二维数组来表示,即简单又易懂.但我们又会碰到下图所示矩阵: 看看这个矩阵,0好多啊(我们称之为稀疏矩阵),若用二维数组来表示,会重复存储了很多个0了,这样浪费了空间. 故要采取一种特殊的方式来存储这样的矩阵,这里就提出了数组的方式来存储这样的矩阵. typedef struct { int row; //行坐标 int col; //列坐标 int value; //该点的值 } i

数据结构----稀疏矩阵的快速转置

使用两种方法将稀疏矩阵快速转置 #include<iostream> #include<vector> using namespace std; template<class T> struct Triple  //三元组 { size_t row; size_t col; T _value; }; template<class T> class SparseMatrix { public: SparseMatrix(T *arr, size_t rowsi

数据结构 - 稀疏矩阵的封装(三元组,行逻辑链接)

稀疏矩阵(三元组,行逻辑连接) 本次代码将关于基本三元组和行逻辑链接表示的三元组进行了封装,还附加了两个系数矩阵的乘法和加法,欢迎大家参考测试代码. #pragma once #include <iostream> #include <queue> #include <vector> #define MAXSIZE 100 using namespace std; typedef struct node { int val; int row; int col; node

数据结构之自建算法库——稀疏矩阵的三元组表示

本文针对数据结构基础系列网络课程(5):数组与广义表中第3课时稀疏矩阵的三元组表示. 稀疏矩阵的三元组表示相关的算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:tup.h,包含定义稀疏矩阵的三元组表示数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef TUP_H_INCLUDED #define TUP_H_INCLUDED #define M 6 #define N 7 #define MaxSize 100 //矩阵中非零元素最多个数 typedef int Ele

数据结构:稀疏矩阵的简单运算

最近专业课比较多,没怎么看数据结构了.今天有点时间写了一下数据结构中稀疏矩阵的运算.写过之后感觉代码的构思不太好.这里先发一下, 假期的时候再重新实现一下. SpMatrix头文件 1 //The sparse matrix's header file 2 //the class SpMatrix 3 //Author: 'Karllen' 4 //Date:05/28/2014 5 6 #ifndef _SpMatrix_H_ 7 #define _SPMatrix_H_ 8 #include

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试

5-4-十字链表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 十字链表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下载

18、蛤蟆的数据结构笔记之十八链表实现稀疏矩阵

18.蛤蟆的数据结构笔记之十八链表实现稀疏矩阵 本篇名言:"必须如蜜蜂一样,采过许多花,才能酿出蜜来." 上篇中实现了栈在多项式实现中的例子,再来看下稀疏矩阵通过链表方式实现. 关键字:十字链表存储 欢迎转载,转载请标明出处: 1.  十字链表存储 十字链表(OrthogonalList)是有向图的另一种链式存储结构.该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的.用十字链表来存储有向图,可以达到高效的存取效果.同时,代码的可读性也会得到提升. 为便于理解后续代码,从网上摘了