集度 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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况