#include
using namespace std;
#define OK 1
#define ERROR 0
#define maxsize 100
typedef int Elemtype;
typedef int Status;
typedef struct
{
int i, j;
Elemtype e;
}Triple;
typedef struct
{
Triple data[maxsize + 1];
int mu, nu, tu;
}TSMatrix;
Status CreateTriple(TSMatrix& T)
{
cout << " 请输入稀疏矩阵的行数,列数和非零元个数:" << endl;
cin >> T.mu >> T.nu >> T.tu;
cout << "请依次输入" << T.tu << "个元素所处的行数,列数和值:" << endl;
for (int i = 1; i <= T.tu; i++)
{
cin >> T.data[i].i >> T.data[i].j >> T.data[i].e;
}
return OK;
}
Status TransposeTSMatrix(TSMatrix T, TSMatrix& Q)
{
Q.mu = T.nu; Q.nu = T.mu; Q.tu = T.tu;
if (Q.tu)
{
int q = 1;
for (int col = 1; col <= T.nu; col++) //col为列标
for (int p = 1; p <= T.mu; p++)
if (T.data[p].j == col)
{
Q.data[q].i = T.data[p].j;
Q.data[q].j = T.data[p].i;
Q.data[q].e = T.data[p].e;
q++;
}
}return OK;
}
Status AddTSMatrix(TSMatrix T, TSMatrix Q, TSMatrix& A)
{
if (T.mu != Q.mu || T.nu != Q.nu) { cout << "两矩阵行数或列数不相等,无法相加!" << endl; return ERROR; }
A.mu = T.mu;
A.nu = T.nu;
A.tu = T.tu + Q.tu;
int mtu = 1, ntu = 1, k = 1;
int x;
while (mtu <= T.tu && ntu <= Q.tu)
{ //若T的行数与Q的行数相同
if (T.data[mtu].i == Q.data[ntu].i) {
if (T.data[mtu].j < Q.data[ntu].j) //若T的列标小于Q的列标
{
A.data[k].i = T.data[mtu].i; // 将T中的非零元素赋给A
A.data[k].j = T.data[mtu].j;
A.data[k].e = T.data[mtu].e;
k++;
mtu++;
}
else if (T.data[mtu].j > Q.data[ntu].j) //若T的列标大于Q的列标
{
A.data[k].i = Q.data[ntu].i; // 将Q中的非零元素赋给A
A.data[k].j = Q.data[ntu].j;
A.data[k].e = Q.data[ntu].e;
k++;
ntu++;
}
else { //若T的列标等于Q的列标 //当两矩阵某一位置行列相同且元素非零,则将两非零元素相加
x = T.data[mtu].e + Q.data[ntu].e;
if (x != 0)
{
A.data[k].i = T.data[mtu].i;
A.data[k].j = T.data[mtu].j; // 将T中的非零元素赋给A
A.data[k].e = x;
k++;
}
mtu++;
ntu++;
}
}
else if (T.data[mtu].i < Q.data[ntu].i) //若T的行标小于Q的行标相同
{
A.data[k].i = T.data[mtu].i;
A.data[k].j = T.data[mtu].j; // 将T中的非零元素赋给A
A.data[k].e = T.data[mtu].e;
k++;
mtu++;
}
else //若T的行标大于Q的行标相同
{
A.data[k].i = Q.data[ntu].i; // 将Q中的非零元素赋给A
A.data[k].j = Q.data[ntu].j;
A.data[k].e = Q.data[ntu].e;
k++;
ntu++;
}
}
while (ntu < Q.tu) //当Q中有元素剩余时
{
A.data[k].i = Q.data[ntu].i; // 将T中的非零元素赋给A
A.data[k].j = Q.data[ntu].j;
A.data[k].e = Q.data[ntu].e;
k++;
ntu++;
}
A.tu = k; //A(相加后的矩阵)的非零元素个数
return OK;
}
Status PrintTSMatrix(TSMatrix T)
{
cout << "稀疏矩阵的行数,列数及非零元个数为:" << T.mu << " " << T.nu << " " << T.tu << endl;
cout << "矩阵中的非零元素为:" << endl;
for (int i = 1; i <= T.tu; i++)
{
cout << "(" << T.data[i].i << "," << T.data[i].j << "," << T.data[i].e << ")" << endl;
}
return OK;
}
int main()
{
TSMatrix T, Q, A;
int n;
cout << "|-----------------------------|" << endl;
cout << "|1------------创建一个稀疏矩阵|" << endl;
cout << "|2------------------矩阵的转置|" << endl;
cout << "|3----------------两个矩阵相加|" << endl;
cout << "|-----------------------------|" << endl;
cout << "请输入操作数:" << endl;
cin >> n;
if (n < 0 || n>3) {
cout << "无效操作!请重新输入!" << endl;
cin >> n;
}
else while (n > 0 && n < 4)
{
switch (n)
{
case 1:
CreateTriple(T);
cout << "构造稀疏矩阵完成!矩阵如下:" << endl;
PrintTSMatrix(T);
cout << "如需继续操作,请输入操作码:" << endl;
cin >> n;
break;
case 2:
cout << "请先输入待转置的矩阵:" << endl;
CreateTriple(T);
TransposeTSMatrix(T, Q);
cout << "转置后的矩阵为:" << endl;
PrintTSMatrix(Q);
cout << "如需继续操作,请输入操作码:" << endl;
cin >> n;
break;
case 3:
cout << "请输待第一个稀疏矩阵:" << endl;
CreateTriple(T);
cout << "请输入第二个稀疏矩阵:" << endl;
CreateTriple(Q);
AddTSMatrix(T, Q, A);
cout << "相加后的矩阵为:" << endl;
PrintTSMatrix(A);
cout << "如需继续操作,请输入操作码:" << endl;
cin >> n;
break;
}
}
}