编程语言
首页 > 编程语言> > C++实现稀疏矩阵的操作,三元组存储---数据结构

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

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

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

标签:转置,初始条件,矩阵,稀疏,C++,三元组,---,TSMatrix
来源: https://blog.csdn.net/Original_xin/article/details/111770707