c++中使用类实现三元组顺序表的转置,加法与乘法

代码展示:

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生成一个数组,同时可以自己确定数组的大小。

总结

代码写得一塌糊涂,大家随便看看就好。

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
稀疏矩阵的转置可以通过三元组顺序表实现三元组顺序表是一种存储稀疏矩阵的数据结构,其元素非零的位置和值被存储在一个三元组转置一个稀疏矩阵需要交换每个非零元素的行和列。因此,我们可以通过遍历三元组顺序表,将每个元素的行和列交换后再插入到新的三元组顺序表,从而得到转置后的稀疏矩阵。 下面是一个示例代码: ```python class Triple: def __init__(self, row, col, value): self.row = row self.col = col self.value = value class SparseMatrix: def __init__(self, row, col, elems): self.row = row self.col = col self.elems = elems def transpose(self): trans_elems = [] for elem in self.elems: trans_elems.append(Triple(elem.col, elem.row, elem.value)) trans_matrix = SparseMatrix(self.col, self.row, trans_elems) return trans_matrix ``` 在这个示例代码,`Triple` 表示三元组,包含行、列和值三个属性。`SparseMatrix` 表示稀疏矩阵,包含行、列和元素三个属性。`transpose` 方法用于转置稀疏矩阵,返回一个新的稀疏矩阵对象。 我们可以通过以下方式创建一个稀疏矩阵对象: ```python elems = [Triple(0, 1, 3), Triple(1, 2, 4), Triple(2, 0, 5)] sparse_matrix = SparseMatrix(3, 3, elems) ``` 这个稀疏矩阵对象表示一个 $3\times3$ 的矩阵,包含三个非零元素。 我们可以调用 `transpose` 方法来得到转置后的稀疏矩阵对象: ```python trans_matrix = sparse_matrix.transpose() ``` 这个 `trans_matrix` 对象表示一个 $3\times3$ 的矩阵,包含三个非零元素,但它们的行和列已经被交换了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值