题目内容
输入一个对称矩阵,将其下三角数据压缩存入一维数组中,输出一维数组数据;
再将此一维数组数据解压为二维数组(原对称矩阵),输出二维数组数据。
个人解法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxLength 9 //然而并没有用到:)
typedef struct
{
int *array_B = NULL;
int length;
} Matrix;
//初始化对称矩阵
void MatrixInit(Matrix &M)
{
printf("请输入对称矩阵的边长:\n");
scanf("%d", &M.length);
M.array_B = (int *)malloc(sizeof(int) * (M.length * (M.length + 1) / 2)); //由于仅输入下三角数据元素,故申请(下)三角区域的存储空间即可
if (M.array_B == NULL) //确定矩阵的压缩存储方式
exit(0);
}
//压缩矩阵
void MatrixCompress(Matrix &M)
{
int i, j;
printf("现开始输入对称矩阵下三角部分。\n");
for (i = 0; i < M.length; i++)
{
printf("第%d行的%d个数据元素: ", i + 1, i + 1);
for (j = 0; j <= i; j++)
{
if (i >= j) //存储下三角的数据元素到一维数组B中
scanf("%d", &M.array_B[i * (i + 1) / 2 + j]);
else //存储上三角的数据元素到一维数组B中
scanf("%d", &M.array_B[j * (j + 1) / 2 + i]);
}
}
printf("下三角数据压缩成的一维数组:");
for (int x = 0; x < M.length * (M.length + 1) / 2; x++)
printf("%d", M.array_B[x]);
printf("\n");
}
//输出矩阵
void MatrixDisplay(Matrix M)
{
int i, j;
printf("对称矩阵输出结果;\n");
for (i = 0; i < M.length; i++)
{
for (j = 0; j < M.length; j++)
{ //返回存储在一维数组B中的二维数组A[i][j]值
if (i >= j)
printf("%3d", M.array_B[i * (i + 1) / 2 + j]);
else
printf("%3d", M.array_B[j * (j + 1) / 2 + i]);
}
printf("\n");
}
}
//销毁矩阵
void MatrixDestroy(Matrix &M)
{
free(M.array_B);
M.array_B = NULL;
}
int main()
{
Matrix M;
MatrixInit(M);
MatrixCompress(M);
MatrixDisplay(M);
MatrixDestroy(M);
system("pause");
return 0;
}
运行结果
本人拙作,请大佬们点评。