代码展示:
Lists.h:
#pragma once
#ifndef XISHU_SHUNXU_H
#define XISHU_SHUNXU_H
#include<iostream>
struct three//三元组的定义
{
int row;//行
int col;//列
int data;//数据
};
class Lists
{
public:
int rows;//行
int cols;//列
int count;//记录非0数量
int** xishu;//记录稀疏表达式
struct three* datas;//记录每个三元组
Lists(int n, int m, int** val);
Lists(int n, int m);
Lists();
void xishu_show();
void display();
};
#endif
LIsts.cpp:
#include "Lists.h"
using namespace std;
Lists::Lists(int n,int m)
{
int i,j;
rows = n;
cols = m;
xishu = new int* [n];
for (i = 0; i < n; i++)
{
xishu[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
xishu[i][j] = 0;
}
}
}
Lists::Lists(int n, int m, int** val)
{
int i, j, k = 0;
rows = n;
cols = m;
count = 0;
xishu = new int* [n];
for (i = 0; i < n; i++)
{
xishu[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
xishu[i][j] = val[i][j];
if (val[i][j] != 0)
{
count++;
}
}
}
datas = new struct three[count];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (val[i][j] != 0)
{
datas[k].row = i;
datas[k].col = j ;
datas[k].data = val[i][j];
k++;
}
}
}
}
void Lists::xishu_show()
{
int i, j;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
cout << xishu[i][j] << '\t';
}
cout << endl;
}
}
void Lists::display()
{
cout << "该三元组顺序表:" << endl;
cout << "矩阵共有" << rows << "行" << " 共有" << cols << "列" << endl;
cout << "非0的三元组,共有" <<count << "个" << endl;
cout << "非0的三元组:" << endl;
cout << "行" << '\t' << "列" << '\t' << "数值" << endl;
for (int i = 0; i < count; i++)
{
cout << datas[i].row+1 << '\t' << datas[i].col+1 << '\t' << datas[i].data << endl;
}
}
Lists change(Lists& t)
{
Lists y(t.cols, t.rows);
y.count = 0;
y.datas = new struct three[t.count];
int i, j;
for (i = 0; i < t.cols; i++)
{
for (j = 0; j < t.count; j++)
{
if (t.datas[j].col == i)
{
y.datas[y.count].row = t.datas[j].col;
y.datas[y.count].col = t.datas[j].row;
y.datas[y.count].data = t.datas[j].data;
y.count++;
}
}
}
for (i = 0; i < y.count; i++)
{
y.xishu[y.datas[i].row][y.datas[i].col] = y.datas[i].data;
}
return y;
}
Lists jia(Lists& a, Lists& b)
{
int i, j,k=0;
Lists c(a.rows>b.rows?a.rows:b.rows, a.cols>b.cols?a.cols:b.cols);
c.count = 0;
c.datas = new struct three[a.count + b.count];
struct three* data = new struct three[a.count + b.count];
for (k = 0;k<a.count; k++)
{
data[k] = a.datas[k];
}
for (i = 0; i < b.count; i++)
{
for (j = 0; j < a.count; j++)
{
if (data[j].row == b.datas[i].row && data[j].col == b.datas[i].col)
{
break;
}
}
if (j != a.count)
{
data[j].data += b.datas[i].data;
}
else
{
data[k] = b.datas[i];
k++;
}
}
for (i = 0; i < k; i++)
{
if (data[i].data != 0)
{
c.datas[c.count].row = data[i].row;
c.datas[c.count].col = data[i].col;
c.datas[c.count].data = data[i].data;
c.count++;
}
}
for (i = 0; i < c.count; i++)
{
c.xishu[c.datas[i].row][c.datas[i].col] = c.datas[i].data;
}
return c;
}
Lists cheng(Lists& a, Lists& b)
{
/*a为x*y,b为y*z*/
Lists c(a.rows, b.cols);
int i, j;
c.datas = new struct three [a.rows * b.cols];
c.count = 0;
for (i = 0; i < a.count; i++)
{
for (j = 0; j < b.count; j++)
{
if (a.datas[i].col == b.datas[j].row)
{
c.datas[c.count].row = a.datas[i].row;
c.datas[c.count].col = b.datas[j].col;
c.datas[c.count].data = a.datas[i].data * b.datas[j].data;
c.count++;
}
}
}
for (i = 0; i < c.count; i++)
{
c.xishu[c.datas[i].row][c.datas[i].col] += c.datas[i].data;
}
c.count = 0;
for (i = 0; i < c.rows; i++)
{
for (j = 0; j < c.cols; j++)
{
if (c.xishu[i][j] != 0)
{
c.datas[c.count].row = i;
c.datas[c.count].col = j;
c.datas[c.count].data = c.xishu[i][j];
c.count++;
}
}
}
return c;
}
int main()
{
int i, j, n, m;
cout << "请输入行数和列数:" << endl;
cin >> n >> m;
int** a = new int*[n];
for (i = 0; i < n; i++)
{
a[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cin >> a[i][j];
}
}
Lists x1(n,m,a);
Lists y = change(x1);
cout << "转置后的矩阵为:" << endl;
y.xishu_show();
cout << "其三元组顺序表达为:" << endl;
y.display();
/*矩阵加法*/
cout << "矩阵加法" << endl;
cout << "请输入行数和列数:" << endl;
cin >> n >> m;
int** b = new int* [n];
for (i = 0; i < n; i++)
{
b[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cin >> b[i][j];
}
}
Lists x2(n, m, b);
Lists x1_x2 = jia(x1, x2);
cout << "相加后的矩阵" << endl;
x1_x2.xishu_show();
cout << "其三元组顺序表达为:" << endl;
x1_x2.display();
/*矩阵乘法*/
cout << "矩阵乘法" << endl;
cout << "请输入行数和列数:" << endl;
cin >> n >> m;
int** c = new int* [n];
for (i = 0; i < n; i++)
{
c[i] = new int[m];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cin >> c[i][j];
}
}
Lists x3(n, m, c);
Lists x1__x2 = cheng(x1, x3);
cout << "相乘后的矩阵" << endl;
x1__x2.xishu_show();
cout << "其三元组顺序表达为:" << endl;
x1__x2.display();
return 0;
}
代码实现思路
定义三元组顺序表为一个类,同时在其中放入了稀疏矩阵这一属性(只是想让这个处理办法,或代码可以更加多元,大家可以在此基础上进行创新和优化)。同时在做矩阵乘法时应该注意能够做矩阵乘法的要求。在代码中采用了指针的指针这一方法,该方法可以便于用new生成一个数组,同时可以自己确定数组的大小。
总结
代码写得一塌糊涂,大家随便看看就好。