集度 2019-11-17 11:51 采纳率: 0%
浏览 255

新人求助,对稀疏矩阵进行基本操作时进行两矩阵相加的最后一个输出始终出错?

#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;
}
}
}

图片说明

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-11-17 11:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大