ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-07-03 20:01:45  阅读:163  来源: 互联网

标签:fopen 转置 tu 矩阵 ++ int 数据结构 data nu


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+”
打开或新建一个二进制文件,可以读,但只允许在文件末尾追写

标签:fopen,转置,tu,矩阵,++,int,数据结构,data,nu
来源: https://www.cnblogs.com/lx06/p/16440683.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有