C++ 三元组存储
#include <iostream>
using namespace std;
#define MAX 100
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct {
int row, col;
int item;
} Triple;
class TripleMatrix {
private:
Triple data[MAX];
int mu, nu, num;
public:
TripleMatrix();
TripleMatrix(int m, int n);
~TripleMatrix();
Status setItem(int row, int col, int item);
int getItem(int row, int col);
void printMatrix();
void printTriple();
friend bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result);
friend bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& result);
};
TripleMatrix::TripleMatrix() {
mu = 0;
nu = 0;
num = 0;
}
TripleMatrix::TripleMatrix(int m, int n) {
mu = m;
nu = n;
num = 0;
}
TripleMatrix::~TripleMatrix() {
}
int TripleMatrix::getItem(int row, int col) {
if (row > mu || col > nu)
return 0;
for (int i = 0; i < num; i++) {
if (data[i].row == row && data[i].col == col) {
return data[i].item;
}
}
return 0;
}
Status TripleMatrix::setItem(int row, int col, int item) {
if (row > mu || col > nu)
return ERROR;
if (num == MAX)
return ERROR;
if (item == 0)
return OK;
int index = 0;
while (index < num) {
if (row > data[index].row) {
index++;
}
else if (row == data[index].row && (col > data[index].col)) {
index++;
}
else {
break;
}
}
if ((row == data[index].row) && (col == data[index].col)) {
data[index].item = item;
}
else {
for (int i = num; i > index; i--) {
data[i].row = data[i - 1].row;
data[i].col = data[i - 1].col;
data[i].item = data[i - 1].item;
}
data[index].row = row;
data[index].col = col;
data[index].item = item;
num++;
}
return OK;
}
void TripleMatrix::printMatrix() {
int tripleIndex = 0;
cout << "打印稀疏矩阵:" << endl;
for (int i = 1; i <= mu; i++) {
for (int j = 1; j <= nu; j++) {
if (i == data[tripleIndex].row && j == data[tripleIndex].col) {
cout << data[tripleIndex].item << "\t";
tripleIndex++;
}
else {
cout << "0\t";
}
}
cout << endl;
}
cout << "矩阵有 " << mu << " 行 " << nu << " 列,共 " << num << " 个非零元素" << endl;
return;
}
void TripleMatrix::printTriple() {
cout << "打印三元组数组:" << endl;
cout << "row\tcol\titem" << endl;
for (int i = 0; i < num; i++) {
cout << data[i].row << "\t" << data[i].col << "\t" << data[i].item << endl;
}
}
void inputMatrix(int m, int n, int num, TripleMatrix& triple) {
int row, col, item;
for (int i = 1; i <= num; i++) {
cout << "请依次输入行,列 和非零元:";
cin >> row >> col >> item;
if (item != 0) {
if (triple.setItem(row, col, item) == ERROR) {
cout << "行号列号不正确,或者三元组数组满,不能正确存储!";
break;
}
}
}
}
bool matrixAdd(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
if (a.mu != b.mu || b.mu != result.mu || a.nu != b.nu || b.nu != result.nu)
{
return false;
}
else {
for (int i = 1; i <= a.mu; i++) {
for (int j = 1; j <= a.nu; j++) {
int item = a.getItem(i, j) + b.getItem(i, j);
if (item != 0) {
result.setItem(i, j, item);
}
}
}
return true;
}
}
bool matrixMulty(TripleMatrix a, TripleMatrix b, TripleMatrix& result) {
int i, j, k;
if (a.nu != b.mu) {
return false;
}
result.mu = a.mu;
result.nu = b.nu;
for (int i = 1; i <= a.mu; i++) {
for (int j = 1; j <= b.nu; j++) {
int sum = 0;
for (int k = 1; k <= a.nu; k++) {
sum += a.getItem(i, k) * b.getItem(k, j);
}
if (sum != 0) {
result.setItem(i, j, sum);
}
}
}
return true;
}
void tripleTest() {
int m, n, num;
cout << "请输入矩阵的行 列 非零元素个数:";
cin >> m >> n >> num;
TripleMatrix triple(m, n);
inputMatrix(m, n, num, triple);
triple.printMatrix();
triple.printTriple();
}
void matrixAddTest() {
int m, n, num;
cout << "请输入第一个矩阵的行,列,非零元素个数";
cin >> m >> n >> num;
cout << "第一个矩阵:" << endl;
TripleMatrix tripleA(m, n);
inputMatrix(m, n, num, tripleA);
tripleA.printMatrix();
cout << "请输入第二个矩阵的行,列,非零元素个数";
cin >> m >> n >> num;
cout << "第二个矩阵:" << endl;
TripleMatrix tripleB(m, n);
inputMatrix(m, n, num, tripleB);
tripleB.printMatrix();
TripleMatrix tripleResult(m, n);
if (matrixAdd(tripleA, tripleB, tripleResult)) {
cout << endl << "矩阵相加后:" << endl;
tripleResult.printMatrix();
}
else{
cout << "矩阵不能相加" << endl;
}
}
void matrixMultyTest() {
int m, n, num;
cout << "请输入第一个矩阵的行,列,非零元素个数";
cin >> m >> n >> num;
cout << "第一个矩阵:" << endl;
TripleMatrix tripleA(m, n);
inputMatrix(m, n, num, tripleA);
tripleA.printMatrix();
cout << "请输入第二个矩阵的行,列,非零元素个数";
cin >> m >> n >> num;
cout << "第二个矩阵:" << endl;
TripleMatrix tripleB(m, n);
inputMatrix(m, n, num, tripleB);
tripleB.printMatrix();
TripleMatrix tripleResult;
if (matrixMulty(tripleA, tripleB, tripleResult)) {
cout << endl << "矩阵相乘后:" << endl;
tripleResult.printMatrix();
}
else {
cout << "矩阵不能相乘" << endl;
}
}
int main() {
matrixMultyTest();
return 0;
}
Java 例子
public class SparseMatrix {
public static void main(String[] args) {
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
System.out.println("输出原始的数组:");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
System.out.println("==========================");
int sum = 0;
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if(array1[i][j] != 0)
sum++;
}
}
System.out.println("有效值的个数:" + sum);
int[][] array2 = new int[sum + 1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[0].length; j++) {
if(array1[i][j] != 0){
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
System.out.println("输出稀疏数组:");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i][0] + "\t" + array2[i][1] + "\t" + array2[i][2]);
}
System.out.println("==========================");
System.out.println("还原矩阵");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}