美文网首页
三元组表实现稀疏矩阵存储(C语言)

三元组表实现稀疏矩阵存储(C语言)

作者: Recalcitrant | 来源:发表于2019-05-26 19:50 被阅读0次

三元组表实现稀疏矩阵存储

/*
稀疏矩阵三元组表
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>

#define ElemType int        //矩阵数据类型

#define OK 0                //操作成功执行
#define ERROR -1            //操作失败
#define OVERFLOW -2         //溢出
typedef int Status;

#define MAXSIZE 12000       //最大非零元数

typedef struct Triple {     //三元组
    int i, j;               //行列下标
    ElemType e;             //非零元元素值
}Triple;
typedef struct TSMatrix {       //矩阵
    Triple data[MAXSIZE + 1];   //三元组表
    int mu, nu, tu;             //矩阵的行列数、非零元个数
}TSMatrix;

TSMatrix *CreateSMatrix();                                  //1.创建
Status DestroySMatrix(TSMatrix *M);                         //2.销毁
Status PrintSMatrix(TSMatrix *M);                           //3.打印
Status CopySMatrix(TSMatrix *M, TSMatrix *T);               //4.复制
Status AddSMatrix(TSMatrix *M, TSMatrix *N, TSMatrix *Q);       //5.矩阵求和
Status SubtSMatrix(TSMatrix *M, TSMatrix *N, TSMatrix *Q);  //6.矩阵求差
Status MultSMatrix(TSMatrix *M, TSMatrix *N, TSMatrix *Q);  //7.矩阵相乘
Status TransposeSMatrix(TSMatrix *M, TSMatrix *T);          //8.矩阵转置

TSMatrix *CreateSMatrix()                                   //1.创建
{
    TSMatrix *M;
    M = (TSMatrix *)malloc(sizeof(TSMatrix));
    std::cout << "请输入矩阵的行数、列数、非零元个数:";
    std::cin >> M->mu >> M->nu >> M->tu;
    for (int i = 0; i < M->tu; i++)
    {
        std::cout << "请输入第" << i + 1 << "个非零元的行下标、列下标、元素值:";
        std::cin >> M->data[i].i >> M->data[i].j >> M->data[i].e;
    }
    return M;
}
Status DestroySMatrix(TSMatrix *M)                          //2.销毁
{
    return OK;
}
Status PrintSMatrix(TSMatrix *M)                                //3.打印
{
    int i, j, t, flag;
    for (i = 0; i < M->mu; i++)
    {
        for (j = 0; j < M->nu; j++)
        {
            flag = 0;
            for (t = 0; t < M->tu; t++)
            {
                if (i == M->data[t].i&&j == M->data[t].j)       //非零元
                {
                    std::cout << M->data[t].e << " ";
                    t++;
                    flag = 1;
                }
            }
            if (flag == 0)std::cout << 0 << " ";
        }
        std::cout << std::endl;
    }
    return OK;
}
Status CopySMatrix(TSMatrix *M, TSMatrix *T)                    //4.复制
{
    return OK;
}
TSMatrix *AddSMatrix(TSMatrix *M, TSMatrix *N)      //5.矩阵求和
{
    TSMatrix *Q;
    Q = (TSMatrix *)malloc(sizeof(TSMatrix));
    int i, j, tm = 0, tn = 0, tq = 0;
    if (M->mu != N->mu || M->mu != N->nu)
    {
        std::cout << "两个矩阵的行列数不相等,无法求和!";
        return NULL;
    }
    Q->mu = M->mu;
    Q->nu = M->nu;
    for (i = 0; i < M->mu; i++)
    {
        for (j = 0; j < M->nu; j++)
        {
            if ((i == M->data[tm].i&&j == M->data[tm].j) && !(i == N->data[tn].i&&j == N->data[tn].j))          //M为非零元
            {
                Q->data[tq].i = i;
                Q->data[tq].j = j;
                Q->data[tq].e = M->data[tm].e;
                tm++;
                tq++;
            }
            else if (!(i == M->data[tm].i&&j == M->data[tm].j) && (i == N->data[tn].i&&j == N->data[tn].j))     //N为非零元
            {
                Q->data[tq].i = i;
                Q->data[tq].j = j;
                Q->data[tq].e = N->data[tn].e;
                tn++;
                tq++;
            }
            else if ((i == M->data[tm].i&&j == M->data[tm].j) || (i == N->data[tn].i&&j == N->data[tn].j))      //M和N均为非零元
            {
                Q->data[tq].i = i;
                Q->data[tq].j = j;
                Q->data[tq].e = M->data[tm].e + N->data[tn].e;
                tm++;
                tn++;
                tq++;
            }
            else
            {
                ;
            }
        }
    }
    tq++;
    Q->tu = tq;
    return Q;
}
Status SubtSMatrix(TSMatrix *M, TSMatrix *N, TSMatrix *Q)       //6.矩阵求差
{
    return OK;
}
Status MultSMatrix(TSMatrix *M, TSMatrix *N, TSMatrix *Q)       //7.矩阵相乘
{
    return OK;
}
TSMatrix *TransposeSMatrix(TSMatrix *M)         //8.矩阵转置
{
    int i, j, t, t_new = 0, temp;
    TSMatrix *T;
    T = (TSMatrix *)malloc(sizeof(TSMatrix));
    T->mu = M->nu;
    T->nu = M->mu;
    T->tu = M->tu;
    /*
    int p, q, col;
    if (M->tu)
    {
        q = 1;
        for (col = 0; col < M->nu; col++)
        {
            for (p = 0; p < M->tu; p++)
            {
                if (M->data[p].j == 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;
                    q++;
                }
            }
        }
    }
    */
    if (M->tu)
    {
        for (i = 0; i < M->tu; i++)
        {
            T->data[i].i = M->data[i].j;
            T->data[i].j = M->data[i].i;
            T->data[i].e = M->data[i].e;
        }
    }
    return T;
}

int main(int argc, char *argv[])
{
    TSMatrix *M, *N, *T, *TT;
    M = CreateSMatrix();
    N = CreateSMatrix();
    std::cout << "矩阵M:" << std::endl;
    PrintSMatrix(M);
    std::cout << "矩阵N:" << std::endl;
    PrintSMatrix(N);

    T = AddSMatrix(M, N);
    std::cout << "T=M+N:" << std::endl;
    PrintSMatrix(T);

    TT = TransposeSMatrix(T);
    std::cout << "矩阵T的转置:" << std::endl;
    PrintSMatrix(TT);

    return 0;
}

相关文章

  • 三元组表实现稀疏矩阵存储(C语言)

    三元组表实现稀疏矩阵存储

  • [矩阵] 三元组表

    将稀疏矩阵表示为三元组表 假设有如下矩阵(行列从0开始编号): 表示为三元组表如下:

  • C语言实现特殊矩阵存储

    下面实现的特殊矩阵存储方法 三元组顺序存储方法&转置 输出结果如下: 行逻辑链接的顺序表

  • 图存存储 邻接矩阵 无向图会比较浪费空间稀疏图也会 邻接表存储 逆邻接表存储 深度和广度优先搜索 广度优先搜索

  • 稀疏矩阵存储格式

    这里只记录其中一种: Compressed Sparse Row Format (CSR) :用三个一维数组存储,...

  • 稀疏矩阵的存储

    如果将整个稀疏矩阵都存储进入内存中的话, 那将会占用相当大的空间, 根据稀疏矩阵中非0元素在矩阵中的分布以及个数,...

  • 稀疏矩阵用于python的keras和theano

    稀疏矩阵 稀疏矩阵(sparse matrix)是由于矩阵中存在大量0,从而可以采用特别的存储技巧来压缩内存。由于...

  • 数据结构-特殊矩阵的压缩存储

    本文介绍对称矩阵、三角矩阵、对角矩阵和稀疏矩阵的压缩存储方法。 对称矩阵 在一个n阶矩阵A中,若元素满足aij=a...

  • 三元组压缩存储稀疏矩阵的转置

    数据结构的一道上机题 主要实现快速转置算法 参考博客: 稀疏矩阵的压缩存储及其转置算法 参考博客把思路讲的很清晰了...

  • 「数据结构 一」C 语言实现顺序表

    作者原创,转载请注明出处。 个人博客:renzhe.name 用 C 语言实现顺序存储结构的线性表,即顺序表。 下...

网友评论

      本文标题:三元组表实现稀疏矩阵存储(C语言)

      本文链接:https://www.haomeiwen.com/subject/gmuxtctx.html