C++实现稀疏矩阵的操作,三元组存储---数据结构

顺序存储结构来表示三元组表,则可以的稀疏矩阵的一种压缩形式。三元组表又称有序的双下标法,它的特点是,非零元素在表中有序存储,因此便于进行依行顺序处理矩阵运算。
1.需求分析:
(1) 输入的形式和输入值的范围:无需自己输入数据,程序是可以自动生成一个稀疏矩阵并输出在界面中。
(2)输出的形式:建立成功后会将三元组表中的数据按照每个元素所在的行号,列号输出元素值;稀疏矩阵的加法则基于三元组表,将两个三元组表的元素进行合并成一个三元组表,然后按照合成的三元组表输出稀疏矩阵信息。
(3) 程序所能达到的功能:
1.自动创立三元组表和稀疏矩阵并显示。
2.稀疏矩阵的加法,赋值等功能。
3.稀疏矩阵的普通转置与快速转置。
4.根据一个稀疏矩阵,显示出稀疏矩阵对应的三元组表。

2. 概要设计
基于三元组表的稀疏矩阵定义如下:
ADT {
基础操作:
Init_Matrix(&T)
操作结果:初始化一个稀疏矩阵T,并对三元组表进行赋值。
Show_Maxtrix(T)
初始条件: 稀疏矩阵T已存在。
操作结果:显示出稀疏矩阵T.
transMartix(T)
初始条件: 稀疏矩阵T已存在。
操作结果:将稀疏矩阵T转置并输出转置后的稀疏矩阵。
QuickTransMartix(M,&t)
初始条件: 稀疏矩阵T已存在。
操作结果:通过快速转置的方法,把稀疏矩阵T转置,并赋值给稀疏矩阵M中。并显示转置后的稀疏矩阵M。
Posistion(T)
初始条件: 稀疏矩阵T已存在。
操作结果:计算并显示稀疏矩阵T各行第一个非零元素在三元组中的下标。
SetMatrix(&T)
初始条件: 稀疏矩阵T已存在。
操作结果:对稀疏矩阵T进行赋值操作,并输出稀疏矩阵T。
addMatrux(&T)
初始条件: 稀疏矩阵T已存在。
操作结果:将把另一个三元组表对应的稀疏矩阵进行相加到稀疏矩阵T上,然后输出稀疏矩阵T。
Show_Tuple(T)
初始条件:稀疏矩阵 T已存在。
操作结果:显示一个稀疏矩阵T的三元组表的表示方法。
CopyMatrix(&T)
初始条件:稀疏矩阵 T已存在。
操作结果:将稀疏矩阵T赋值给另外一个稀疏矩阵T1,并输出稀疏矩阵T1.
MultiMatrix(&T)
初始条件:稀疏矩阵 T已存在。
操作结果:将稀疏矩阵T与另一个稀释矩阵相乘,并把结果存在T中,运算结束好输出结果T。
}

菜单如下:

while (flag) {  
        cout << "****************测试稀疏矩阵的操作****************" << endl;  
        cout << "              (采用三元组表顺序存储)                " << endl;  
        cout << "1.求稀疏矩阵的转置矩阵" << endl;  
        cout << "2.快速求稀疏矩阵的转置矩阵" << endl;  
        cout << "3.计算稀疏矩阵各行第一个非零元素在三元组中的下标" << endl;  
        cout << "4.稀疏矩阵的赋值运算" << endl;  
        cout << "5.求稀疏矩阵的加法" << endl;  
        cout << "6.求稀疏矩阵的乘积" << endl;  
        cout << "7.显示稀疏矩阵的三元组表示" << endl;  
        cout << "8.随机生成稀疏矩阵" << endl;  
        cout << "9.用已有的稀疏矩阵初始化一个新矩阵" << endl;  
        cout << "10.输入稀疏矩阵的三元组表" << endl;  
        show_Maxtrix(T);  
        cout << endl;  
        cout << "请输入与你的选择(1-10  其他退出程序):"; int ch; cin >> ch;     

三元组表定义如下:

typedef struct {  
    int i, j;  //该非零元的行下标和列下表  
    Elemtype e;  
}Triple;  
typedef struct {  
    Triple data[MAXSIZE + 1];//非零三元组表,data[0]未用  
    int mu, nu, tu; //矩阵的行数,列数和非零元的个数  
}TSMatrix;  

几个重要的操作函数如下:

1.快速转置函数:

Statues quickTransMartix(TSMatrix M, TSMatrix& T) {  
    T.mu = M.mu; T.nu = M.nu; T.tu = M.tu;  
    if (T.tu) {  
        int num[10] = { 0 };  
        int copt[10] = { 0 };  
        for (int col = 1; col <= M.nu; ++col) num[col] = 0;  
        for (int t = 1; t <= M.tu; ++t) ++num[M.data[t].j];  
        copt[0] = 0;  
        for (int col = 1; col < M.nu; ++col) copt[col] = copt[col - 1] + num[col - 1];  
        int q;  
        for (int p = 1; p <= M.tu; p++) {  
            int col = M.data[p].j;  
            q = copt[col];  
            T.data[q].i = M.data[p].j;  
            T.data[q].j = M.data[p].i;  
            T.data[q].e = M.data[p].e;  
            ++copt[col];  
        }  
    }  
    int arry[10][10] = { 0 };  
    for (int i = 0; i < T.tu; i++)  {  
        arry[T.data[i].i][T.data[i].j] = T.data[i].e;  
    }  
    cout << "**************************************" << endl;  
    cout << "   ";  
    for (int i = 1; i <= T.nu; i++) cout << "[" << i << "]" << "  ";  
    cout << endl;  
    for (int i = 1; i <= T.mu; i++) {  
        cout << "[" << i << "]" << " ";  
        for (int j = 1; j <= T.nu; j++) {  
            cout << arry[i][j] << "    ";  
        }  
        cout << endl;  
    }  
    cout << "**************************************" << endl;  
    system("pause");  
    return OK;  
}  

计算稀疏矩阵各行第一个非零元素在三元组中的下标

Statues posistion(TSMatrix T) {  
    int arry[7] = { 0 };  
    for (int i = 1; i <= T.tu; i++) arry[T.data[i].i]++;  
    for (int i = 1; i <= 6; i++) cout << "[" << i << "]" << "  ";  
    cout << endl;  
    for (int i = 1; i <= 6; i++) {  
        int temp = 0;  
        if (arry[i] != 0) {  
            for (int j = 1; j <= i - 1; j++)  temp += arry[j];  
            cout << temp + 1 << "     ";  
        }  
        else {  
            cout << 0 << "    ";  
        }  
    }  
    cout << endl;  
    system("pause");  
    return OK;  
}  

求稀疏矩阵的加法

Statues addMatrix(TSMatrix& T) {  
    TSMatrix T1;  
    cout << "自动生成的另外一个稀疏矩阵:" << endl;  
    init_Matrix(T1);  
    show_Maxtrix(T1);  
    system("pause");  
    int arry[10][10] = { 0 };  
    for (int i = 1; i <= T.tu; i++)  arry[T.data[i].i][T.data[i].j] = 1;  
    for (int i = 1; i <= T1.tu; i++) {  
        if (arry[T1.data[i].i][T1.data[i].j] == 1) {  
            T.data[i].e += T1.data[i].e;  
        }  
        else {  
            T.tu++;  
            T.data[T.tu].i = T1.data[i].i;  
            T.data[T.tu].j = T1.data[i].j;  
            T.data[T.tu].e = T1.data[i].e;  
        }  
    }  
    for (int i = 0; i < 10; i++) {  
        for (int j = 0; j < 10; j++)  arry[i][j] = 0;  
    }  
    cout << "矩阵相加结果如下" << endl;  
    show_Maxtrix(T);  
    system("pause");  
    return OK;  
}  

求稀疏矩阵的乘积

Statues multiMatrix(TSMatrix& T) {  
    TSMatrix T1;  
    init_Matrix(T1);  
    cout << "自动生成的另一个稀疏矩阵" << endl;  
    show_Maxtrix(T1);  
    int arry[10][10] = { 0 };  
    int arry1[10][10] = { 0 };  
    int arry2[10][10] = { 0 };  
    for (int i = 1; i <= T.tu; i++) arry1[T.data[i].i][T.data[i].j] = T.data[i].e;  
//  for (int i = 1; i <= T.tu; i++) cout << T.data[i].i << " " << T.data[i].j << " " << T.data[i].e << endl;  
    for (int i = 1; i <= T1.tu; i++) arry2[T1.data[i].i][T1.data[i].j] = T1.data[i].e;  
    for (int i = 1; i <= 6; i++) {  //行  
        for (int j = 1; j <= 6; j++) {  //列  
            int sum = 0;  
            for (int k = 1; k <= 6; k++) {  
                    sum += arry1[i][k] * arry2[k][j];  
                    arry[i][j] = sum;  
                //if (arry[i][k] != 0 || arry[k][j] != 0) cout << arry1[i][k] << "  " << arry2[k][j] << " " << arry1[i][k] * arry2[k][j] << endl;  
                  
            }  
        }  
    }    
    cout << "相乘后的矩阵为" << endl;  
    cout << "**************************************" << endl;  
    cout << "   ";  
    for (int i = 1; i <= 6; i++) cout << "[" << i << "]" << "  ";  
    cout << endl;  
    for (int i = 1; i <= 6; i++) {  
        cout << "[" << i << "]" << " ";  
        for (int j = 1; j <= 6; j++) {  
            cout << arry[i][j] << "    ";  
        }  
        cout << endl;  
    }  
    cout << "**************************************" << endl;      
    system("pause");  
    return OK;  
}  

主要的操作就像上面代码所描述,其实还是挺简单的,可能快速转置有稍微有点复杂。

运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是我们学校的一次数据结构实验,还需要好好学习知识,还存在许多不足,希望大家多多指教!

  • 7
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 三元组顺序表是一种存储稀疏矩阵的方式,可以用来表示矩阵中非零元素的位置和值。其中,每个三元组包含三个元素:行号、列号和元素值。 要实现两个矩阵的相加和相减,需要先将它们转换成三元组顺序表的形式,然后按照行号和列号的顺序进行遍历,将相同位置的元素相加或相减,最后得到结果矩阵的三元组顺序表。 转置操作可以通过交换每个三元组的行号和列号来实现。具体地,对于一个三元组 (i, j, v),它在转置后的矩阵中的位置应该是 (j, i, v)。 总之,使用三元组顺序表存储稀疏矩阵可以方便地实现矩阵的加减和转置操作。 ### 回答2: 三元组顺序表是一种稀疏矩阵存储方式,通过记录非零元素的值、所在行列号来压缩表示大量零元素的矩阵,节约存储空间。实现两个矩阵的相加、相减与转置,需要按照三元组顺序表的存储方式,对两个矩阵的数据进行处理。 1. 三元组顺序表的存储方式: 三元组顺序表的每个元素由三个部分组成:非零元素值、所在行号、所在列号。非零元素在三元组中按行、列顺序排列,同一行的元素按列递增排序。例如,一个5*5的矩阵: 0 0 1 0 0 0 2 0 3 0 4 0 0 0 5 0 6 0 7 8 0 0 9 10 0 可以用三元组顺序表表示为: (5, 5, 7) # 稀疏矩阵的行列数、非零元素个数 [(1, 3, 1), (2, 2, 2), (2, 4, 3), (3, 1, 4), (3, 5, 5), (4, 2, 6), (4, 4, 7), (4, 5, 8), (5, 3, 9), (5, 4, 10)] # 非零元素的三元组 2. 稀疏矩阵相加、相减: 对于两个矩阵的相加、相减,需要先将它们的三元组按行列号排序,然后按照顺序遍历两个三元组表,将行列号相同的元素相加或相减,得到新的三元组表。具体步骤如下: (1) 将两个矩阵的三元组按行列号排序 (2) 从头开始遍历两个三元组表,若行列号相同,则将两元素相加或相减,并加入结果矩阵的三元组表中 (3) 若行列号不同,则将较小的行列号的元素加入结果矩阵的三元组表中 (4) 若一个三元组表遍历完,则将另一个三元组表的剩余元素加入结果矩阵的三元组表中 3. 稀疏矩阵转置: 对于矩阵的转置,同样需要将矩阵的三元组按行列号排序。然后,遍历三元组表,将每个元素的行列号交换,并插入到转置后的三元组表中。具体步骤如下: (1) 将矩阵的三元组按行列号排序 (2) 从头开始遍历三元组表,将每个元素的行列号交换,并插入到转置后的三元组表中 以上就是用三元组顺序表存储稀疏矩阵实现两个矩阵的相加、相减与转置的方法。矩阵相加、相减的时间复杂度为O(n),转置矩阵的时间复杂度为O(nlogn)。 ### 回答3: 稀疏矩阵是指大部分元素为0的矩阵,因为这些元素对于运算并没有实质性的作用,所以使用三元组顺序表来存储稀疏矩阵可以极大地提高运算效率。 三元组顺序表是一种以三元组的形式进行存储数据结构,以此存储稀疏矩阵可以节省存储空间。其中,每个三元组都包含三个数据项,分别是该非零元素的行数、列数以及元素值,可以表示为(i, j, value)。 相加与相减 使用三元组顺序表存储两个稀疏矩阵,可以通过从数组中遍历每个非零元素,并比较其在两个矩阵中的位置来实现两个矩阵的加减。具体步骤如下: 1. 遍历两个矩阵的三元组数组,分别找到相同行数和列数的非零元素。 2. 比较两个矩阵相同位置的元素大小,决定是相加还是相减。 3. 若某一矩阵当前行或列已经遍历完,而另一矩阵还有未遍历到的行或列,则将剩余部分复制到结果数组中。 转置 稀疏矩阵的转置是指将矩阵中所有元素绕对角线翻转,即将矩阵的行和列交换。对于三元组顺序表来说,转置操作需要改变存储方式,即改变原先每个元素的行数和列数,将其进行交换,同时保留其元素值不变。 具体步骤如下: 1. 读取原矩阵中的每一个三元组(i, j, value)。 2. 将该三元组的行数和列数对换(i,j变为j,i),并将它的元素值存入新矩阵中它对应的位置。 3. 将新矩阵中所有三元组按行数从小到大进行排序,使其成为三元组顺序表。 4. 输出结果矩阵。 总之,使用三元组顺序表存储稀疏矩阵,可以有效节省运算时间和存储空间。相加、相减和转置都可以通过遍历矩阵中的三元组实现,对于数据处理的稀疏矩阵,这种存储方式可以提高运算效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值