学习贺利坚老师对称矩阵压缩存储
数据结构实践——压缩存储的对称矩阵的运算_计算压缩存储对称矩阵 a 与向量 b 的乘积-CSDN博客
本人解析博客
矩阵存储和特殊矩阵的压缩存储_n阶对称矩阵压缩-CSDN博客
版本更新日志
V1.0: 对老师代码进行模仿 , 我进行名字优化, 思路代码注释
功能函数
//为N阶矩阵初始化成的一维数组分配空间
void Init_symmetrical_matrix(int *&matrix);
//返回二维矩阵的值(压缩存取)
int get_Value_symmetrical_matrix(int matrix[],int x,int y);
//把值传进二维对称矩阵(压缩存储)
void Assign_symmetrical_matrix(int matrix[],int input_value,int x,int y);
//输出展示压缩存储的对称矩阵
void Display_symmetrical_matrix(int matrix[]);
//销毁存储空间
void Destroy_symmetrical_matrix(int matrix[]);
具体功能函数实现:
#define max_wide 4
/**************************************************
函数名: Init_symmetrical_matrix
功 能: 初始化对称矩阵,为其分配存储空间
参 数: int *&matrix:给对应矩阵分配空间
返回值: 无
**************************************************/
void Init_symmetrical_matrix(int *&matrix)
{
//给地址分配空间
matrix = (int*)malloc(sizeof(int)*(max_wide*(max_wide+1)/2));
}
/**************************************************
函数名: get_Value_symmetrical_matrix
功 能: 得到对称矩阵的值(利用压缩存储,所以通过一维数组转换)
参 数: (1)int matrix[]:对称矩阵
(2)int x:对应的横坐标
(3)int y:纵坐标
返回值: int:对应坐标的值
**************************************************/
int get_Value_symmetrical_matrix(int matrix[],int x,int y)
{
if(x >= y)
{
return matrix[x*(x+1)/2+y];
}
else
{
return matrix[y*(y+1)/2+x];
}
}
/**************************************************
函数名: Assign_symmetrical_matrix
功 能: 给对称压缩矩阵赋值(和取值一样,也是通过一维数组转换)
参 数: (1)int matrix[]:要赋值的对称压缩矩阵
(2)int input_value:要赋的值
(3)int x:对应的横坐标
(4)int y:对应的纵坐标
返回值: 无
**************************************************/
void Assign_symmetrical_matrix(int matrix[],int input_value,int x,int y)
{
if(x >= y)
{
matrix[x*(x+1)/2+y] = input_value;
}
else
{
matrix[y*(y+1)/2+x] = input_value;
}
return;
}
/**************************************************
函数名: Display_symmetrical_matrix
功 能: 输出展示对称矩阵(调用取值函数)
参 数: int matrix[]:要展示的对称矩阵
返回值: 无
**************************************************/
void Display_symmetrical_matrix(int matrix[])
{
int i,j;
for(i = 0; i<max_wide; i++)
{
for(j = 0; j<max_wide; j++)
{
printf("%5d",get_Value_symmetrical_matrix(matrix,i,j));
}
printf("\n\n");
}
}
/**************************************************
函数名: Destroy_symmetrical_matrix
功 能: 销毁对称压缩矩阵的空间
参 数: int matrix[]:要销毁的压缩矩阵
返回值: 无
**************************************************/
void Destroy_symmetrical_matrix(int matrix[])
{
free(matrix);
}
main函数调用
int main()
{
int *matrix_test1;
int line,row;//行,列
int input_value;
Init_symmetrical_matrix(matrix_test1);
printf("\n请输入对称矩阵(只需要输出下三角部分即可)\n");
for(line = 0; line < max_wide; line++)
{
printf("\n请输入第%d行的%d个数据元素:\n",line+1,line+1);
for(row = 0; row <= line; row++)
{
scanf("%d",&input_value);
Assign_symmetrical_matrix(matrix_test1,input_value,line,row);
}
}
Display_symmetrical_matrix(matrix_test1);
Destroy_symmetrical_matrix(matrix_test1);
return 0;
}
main.cpp(包含功能函数)
#include <stdio.h>
#include <malloc.h>
#define max_wide 4
//为N阶矩阵初始化成的一维数组分配空间
void Init_symmetrical_matrix(int *&matrix);
//返回二维矩阵的值(压缩存取)
int get_Value_symmetrical_matrix(int matrix[],int x,int y);
//把值传进二维对称矩阵(压缩存储)
void Assign_symmetrical_matrix(int matrix[],int input_value,int x,int y);
//输出展示压缩存储的对称矩阵
void Display_symmetrical_matrix(int matrix[]);
//销毁存储空间
void Destroy_symmetrical_matrix(int matrix[]);
/**************************************************
函数名: Init_symmetrical_matrix
功 能: 初始化对称矩阵,为其分配存储空间
参 数: int *&matrix:给对应矩阵分配空间
返回值: 无
**************************************************/
void Init_symmetrical_matrix(int *&matrix)
{
//给地址分配空间
matrix = (int*)malloc(sizeof(int)*(max_wide*(max_wide+1)/2));
}
/**************************************************
函数名: get_Value_symmetrical_matrix
功 能: 得到对称矩阵的值(利用压缩存储,所以通过一维数组转换)
参 数: (1)int matrix[]:对称矩阵
(2)int x:对应的横坐标
(3)int y:纵坐标
返回值: int:对应坐标的值
**************************************************/
int get_Value_symmetrical_matrix(int matrix[],int x,int y)
{
if(x >= y)
{
return matrix[x*(x+1)/2+y];
}
else
{
return matrix[y*(y+1)/2+x];
}
}
/**************************************************
函数名: Assign_symmetrical_matrix
功 能: 给对称压缩矩阵赋值(和取值一样,也是通过一维数组转换)
参 数: (1)int matrix[]:要赋值的对称压缩矩阵
(2)int input_value:要赋的值
(3)int x:对应的横坐标
(4)int y:对应的纵坐标
返回值: 无
**************************************************/
void Assign_symmetrical_matrix(int matrix[],int input_value,int x,int y)
{
if(x >= y)
{
matrix[x*(x+1)/2+y] = input_value;
}
else
{
matrix[y*(y+1)/2+x] = input_value;
}
return;
}
/**************************************************
函数名: Display_symmetrical_matrix
功 能: 输出展示对称矩阵(调用取值函数)
参 数: int matrix[]:要展示的对称矩阵
返回值: 无
**************************************************/
void Display_symmetrical_matrix(int matrix[])
{
int i,j;
for(i = 0; i<max_wide; i++)
{
for(j = 0; j<max_wide; j++)
{
printf("%5d",get_Value_symmetrical_matrix(matrix,i,j));
}
printf("\n\n");
}
}
/**************************************************
函数名: Destroy_symmetrical_matrix
功 能: 销毁对称压缩矩阵的空间
参 数: int matrix[]:要销毁的压缩矩阵
返回值: 无
**************************************************/
void Destroy_symmetrical_matrix(int matrix[])
{
free(matrix);
}
int main()
{
int *matrix_test1;
int line,row;//行,列
int input_value;
Init_symmetrical_matrix(matrix_test1);
printf("\n请输入对称矩阵(只需要输出下三角部分即可)\n");
for(line = 0; line < max_wide; line++)
{
printf("\n请输入第%d行的%d个数据元素:\n",line+1,line+1);
for(row = 0; row <= line; row++)
{
scanf("%d",&input_value);
Assign_symmetrical_matrix(matrix_test1,input_value,line,row);
}
}
Display_symmetrical_matrix(matrix_test1);
Destroy_symmetrical_matrix(matrix_test1);
return 0;
}