数据结构复习代码——矩阵的相关操作以及矩阵快速转置算法的实现以及遇到问题及解决

2022/7/4 1:21:33

本文主要是介绍数据结构复习代码——矩阵的相关操作以及矩阵快速转置算法的实现以及遇到问题及解决,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、矩阵的相关操作以及矩阵快速转置算法的实现(加减乘并未实现)

#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<assert.h>

#define ElemType int
#define MAXSIZE 100


//三元组定义
typedef struct Triple
{
    int i;
    int j;
    ElemType e;
}Triple;


//矩阵定义
typedef struct SMatrix
{
    Triple data[MAXSIZE];
    int mu;
    int nu;
    int tu;
}SMatrix;

//创建矩阵
void CreateMatrix(SMatrix *M)
{
    FILE *fp;
    fp = fopen("Matrix.txt", "r");
    if (fp == NULL)
        exit(1);
    fscanf(fp, "%d %d", &M->mu, &M->nu);
    int value;
    int k = 0;
    for (int i=0;i<M->mu;i++)
    {
        for (int j = 0; j < M->nu; j++)
        {
            fscanf(fp, "%d", &value);
            if (value != 0)
            {
                M->data[k].e = value;
                M->data[k].i = i;
                M->data[k].j = j;
                k++;
            }
        }
    }
    M->tu = k;
    fclose(fp);
}


//输出矩阵
void PrintfMatrix(SMatrix *M)
{
    printf("row=%d col=%d\n", M->mu, M->nu);
    for (int i = 0; i < M->tu; i++)
    {
        printf("(%d %d %d)\n", M->data[i].i, M->data[i].j, M->data[i].e);
    }
}

//拷贝矩阵
void CopyMatrix(SMatrix *M, SMatrix *T)
{
    T->mu = M->mu;
    T->nu = M->nu;
    T->tu = M->tu;
    for (int i = 0; i < M->tu; i++)
    {
        T->data[i].i = M->data[i].i;
        T->data[i].j = M->data[i].j;
        T->data[i].e = M->data[i].e;
    }
}
//矩阵的转置实现
void TransposeMatrix(SMatrix *M,SMatrix *T)
{
    T->mu = M->nu;
    T->nu = M->mu;
    T->tu = M->tu;
    int k = 0;
    if(M->tu != 0)
    {
        for(int col=0; col<M->nu; col++)
        {
            for(int i=0; i<M->tu; i++)
            {
                if(M->data[i].j == col)
                {
                    T->data[k].i = M->data[i].j;
                    T->data[k].j = M->data[i].i;
                    T->data[k].e = M->data[i].e;
                    k++;
                }
            }
        }
    }
}

//使用空间换取时间,矩阵快速转置算法
void FastTransposeMatrix(SMatrix *M,SMatrix *T)
{
    T->mu = M->nu;
    T->nu = M->mu;
    T->tu = M->tu;
    int *num = (int*)malloc(sizeof(int) * M->nu);
    assert(num != NULL);

    int *cpot = (int*)malloc(sizeof(int) * M->nu);
    assert(cpot != NULL);

    int col = 0;
    if(T->tu != 0)
    {
        for(col=0; col<M->tu; col++)
        {
            num[col] = 0;
        }
        for(int t=0; t<M->tu; t++)
        {
            num[M->data[t].j]++;
        }
        cpot[0] = 0;
        for(int i=1;i<M->nu;i++)
        {
            cpot[i] = cpot[i-1] + num[i-1];
        }
        int q = 0;
        for(int p=0; p<M->tu; p++)
        {
            col = M->data[p].j;
            q = cpot[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;
            cpot[col]++;
        }
    }


}

int main()
{
    SMatrix sm,sm1;
    memset(&sm, 0, sizeof(sm));
    //创建矩阵操作
    CreateMatrix(&sm);
    //拷贝矩阵
    CopyMatrix(&sm, &sm1);
    PrintfMatrix(&sm1);

    FastTransposeMatrix(&sm,&sm1);
    //输出矩阵
    PrintfMatrix(&sm1);
    return 0;
}

 2、c++   文件操作fopen、fopen_s的用法

本人操作时,VS2017中fopen_s适用,CodeBlocks中fopen适用

定义FILE *fp 之后
fopen的用法是: fp = fopen(“filename”,“r”);
对于fopen_s来说,还得定义另外一个变量 errno_t err,
然后err = fopen_s(&fp,“filename”,“r”);
返回值:
fopen:打开文件成功的话返回文件指针(赋值给fp),打开失败则返回 NULL值;
fopen_s:打开文件成功返回0,失败返回非0。

//打开文件
        FILE *fp;
        errno_t err = fopen_s( &fp, "Matrix.txt", "r");

   “r” = “rt”

打开一个文本文件,文件必须存在,只允许读
“r+” = “rt+”
打开一个文本文件,文件必须存在,允许读写
“rb”
打开一个二进制文件,文件必须存在,只允许读
“rb+”
打开一个二进制文件,文件必须存在,允许读写
“w” = “wt”
新建一个文本文件,已存在的文件将内容清空,只允许写
“w+” = “wt+”
新建一个文本文件,已存在的文件将内容清空,允许读写
“wb”
新建一个二进制文件,已存在的文件将内容清空,只允许写
“wb+”
新建一个二进制文件,已存在的文件将内容清空,允许读写
“a” = “at”
打开或新建一个文本文件,只允许在文件末尾追写
“ab”
打开或新建一个二进制文件,只允许在文件末尾追写
“ab+”
打开或新建一个二进制文件,可以读,但只允许在文件末尾追写



这篇关于数据结构复习代码——矩阵的相关操作以及矩阵快速转置算法的实现以及遇到问题及解决的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程