数据结构与算法(C语言)代码实现-对称矩阵压缩与解压缩的代码实现

现有一个5×5的对称矩阵,用C语言来实现对称矩阵的压缩与解压缩,这里我们对下三角进行存储,即可完成矩阵的压缩。
在这里插入图片描述

代码执行结果

在这里插入图片描述

C代码实现

//
// Created by wtk on 22-11-30.
//

#include <stdio.h>

/**
 * 对称矩阵压缩算法:传入一个对称矩阵,返回压缩后的一维数组
 * @param matrix_table 矩阵
 * @param compress 用来接收压缩结果的一维数组
 * @param len 一维数组的长度
 */
void symmetric_matrix_compression(int matrix_table[5][5], int *compress, int len){
    //矩阵的行数量
    int row_count = 5;

    //进行压缩
    //按行循环

    for(int i = 0; i < row_count; i++){
        //每行需要压缩的列
        for(int k = 0; k <= i; k++){
            int index = (i+1)*i/2 + k;
            compress[index] = matrix_table[i][k];
        }
    }
    //打印压缩结果
    printf("压缩结果:\n");
    printf("[");
    for(int i = 0; i < len; i++){
        if(i == len-1){
            printf("%d", compress[i]);
        } else{
            printf("%d, ", compress[i]);
        }
    }
    printf("]\n");
}

/**
 * 对称矩阵解压缩算法:传入一个对称矩阵压缩后得到的一维数组,解压缩成对称矩阵
 * @param compress
 * @param size 矩阵的行数和列数 [行数,列数]
 */
void symmetric_matrix_decompression(int* compress, int size[2]){
    int row_count = size[0];
    int column_count = size[1];
    //定义矩阵
    int matrix[row_count][column_count];
    //解压缩
    //按行循环
    for(int i = 0; i < row_count; i++){
        //每行存储的列数
        for(int k = 0; k <= i; k++){
            int index = (i+1)*i/2 + k;
            matrix[i][k] = compress[index];
            matrix[k][i] = matrix[i][k];
        }
    }
    //打印
    printf("解压结果:\n");
    for(int i = 0; i<row_count; i++){
        for(int k = 0; k<row_count; k++){
            printf("%d\t\t", matrix[i][k]);
        }
        printf("\n\n");
    }
}

int main(){
    int data[5][5] = {
            {1,2,3,4,5},
            {2,4,6,8,7},
            {3,6,5,5,4},
            {4,8,5,6,8},
            {5,7,4,8,5}
    };
    //计算压缩户的一维数组长度
    int compress_len = (5+1)*5/2;
    //定义存放压缩结果的一维数组
    int compress_result[compress_len];
    //进行压缩
    symmetric_matrix_compression(data,compress_result, compress_len);
    int size[2] = {5,5};
    symmetric_matrix_decompression(compress_result, size);
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值