一、引言
感谢宝子们一键三连支持,火速更新中~~
特殊矩阵,主要分为两类:①、对称矩阵:含有大量相同数据元素的矩阵。②、稀疏矩阵、上\下三角矩阵:含有大量 0 元素的矩阵。在数据结构中,压缩存储的思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。
在数据结构中稀疏矩阵的压缩存储有 3 种具体实现方式:①三元组顺序表,②行逻辑链接的顺序表,③十字链表。
二、目的
- 掌握矩阵压缩存储的存储结构
- 掌握矩阵压缩存储的基本操作
- 掌握矩阵压缩存储的基本特性
三、环境与设备
操作系统:Windows 10
编译器:Visual Studio 2021
四、存储结构
三元组存储结构
typedef int DataType;
typedef struct
{
int i,j;
DataType v;
}TriTupleElem;
typedef struct
{
TriTupleElem data[MAX];
int m,n,t;
}TriTupleTable;
五、函数
2. void inputsymmatrix(int *data,int n)//输入矩阵
3. void outputsymmatrix(int *data,int n)//输出对称矩阵
4. void outputdsmatrix(int *data,int n)//输出三角矩阵
5. void inputThreeMatrix(int *data,int n)//输入三对角矩阵
6. void outputThreeMatrix(int *data,int n)//输出三对角矩阵
7. void inputTriTable(TriTupleTable *TTT)//输入三元组矩阵
8. void outputTriTable(TriTupleTable *TTT)//输出三元组矩阵
9. void TransTriTable(TriTupleTable *TTT)//三元组矩阵的转置运算
六、核心代码
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
typedef int DataType;
typedef struct
{
int i,j,k;
DataType v;
}TriTupleElem;
typedef struct
{
TriTupleElem data[MAX];
}TriTupleTable;
void menu();
void inputsymmatrix(int *data,int n);//输入矩阵
void outputsymmatrix(int *data,int n);//输出对称矩阵
void outputdsmatrix(int *data,int n);//输出三角矩阵
void inputThreeMatrix(int *data,int n);//输入三对角矩阵
void outputThreeMatrix(int *data,int n);//输出三对角矩阵
void inputTriTable(TriTupleTable *TTT);//输入三元组矩阵
void outputTriTable(TriTupleTable *TTT);//输出三元组矩阵
void TransTriTable(TriTupleTable *TTT);//三元组矩阵的转置运算
int main()
{
menu();
}
void inputsymmatrix(int *data,int n)//输入矩阵
{
int temp;
printf("请输入对称矩阵的%d个数值:\n",n*(n+1)/2);
for(int i=0;i<(n*(n+1)/2);i++)
{
printf("请输入第%d个数值:",i+1);
scanf("%d",&temp);
data[i]=temp;
}
}
void outputsymmatrix(int *data,int n)//输出对称矩阵
{
int k;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i>=j)
{
k=i*(i+1)/2+j;
}
else
{
k=j*(j+1)/2+i;
}
printf("%5d",data[k]);
}
printf("\n");
}
}
void outputdsmatrix(int *data,int n)//输出三角矩阵
{
int k;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i>=j)
{
k=i*(i+1)/2+j;
printf("%5d",data[k]);
}
else
{
printf("%5d",0);
}
}
printf("\n");
}
}
void inputThreeMatrix(int *data,int n)//输入三对角矩阵
{
int temp;
printf("请输入对称矩阵的%d个数值:\n",3*n-2);
for(int i=0;i<3*n-2;i++)
{
printf("请输入第%d个数值:",i+1);
scanf("%d",&temp);
data[i]=temp;
}
}
void outputThreeMatrix(int *data,int n)//输出三对角矩阵
{
int k;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i-j==-1 || i-j==1 || i-j==0)
{
k=2*i+j;
printf("%5d",data[k]);
}
else
{
printf("%5d",0);
}
}
printf("\n");
}
}
void inputTriTable(TriTupleTable *TTT)//输入三元组矩阵
{
for(int i=1;i<=TTT->data[0].v;i++)
{
printf("请输入三元矩阵的行 列 值:\n");
scanf("%d %d %d",&TTT->data[i].i,&TTT->data[i].j,&TTT->data[i].v);
TTT->data[i].k=i;
}
}
void outputTriTable(TriTupleTable *TTT)//输出三元组矩阵
{
int m,n,count=1;
m=TTT->data[0].i;
n=TTT->data[0].j;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
int sign=1;
for(int p=1;p<=TTT->data[0].v;p++)
{
if(TTT->data[p].i==i && TTT->data[p].j==j)
{
sign=0;
printf("%5d",TTT->data[p].v);
}
}
if(sign)
{
printf("%5d",0);
}
}
printf("\n");
}
printf("置换后的三元矩阵为:\n");
TransTriTable(TTT);
}
void TransTriTable(TriTupleTable *TTT)//三元组矩阵的转置运算
{
int m,n,count=1;
m=TTT->data[0].i;
n=TTT->data[0].j;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int sign=1;
for(int p=1;p<=TTT->data[0].v;p++)
{
if(TTT->data[p].i==j && TTT->data[p].j==i)
{
sign=0;
printf("%5d",TTT->data[p].v);
}
}
if(sign)
{
printf("%5d",0);
}
}
printf("\n");
}
}
void menu()
{
system("mode con cols=80 lines=45");
system("color F4");
printf("\t***************************************************************\n");
printf("\t* 矩阵压缩 *\n");
printf("\t***************************************************************\n");
printf("\t*\t\t 1.输入对称矩阵 *\n");
printf("\t*\t\t 2.输出对称矩阵 *\n");
printf("\t*\t\t 3.输出三角矩阵 *\n");
printf("\t*\t\t 4.输入三对角矩阵 *\n");
printf("\t*\t\t 5.输出三对角矩阵 *\n");
printf("\t*\t\t 6.输入三元组矩阵 *\n");
printf("\t*\t\t 7.输出三元组矩阵 *\n");
printf("\t*\t\t 8.三元组矩阵的转置运算 *\n");
printf("\t***************************************************************\n");
int n;
int *data;
TriTupleTable *TTT;
printf("\t\t请选择功能\n");
int a;
scanf("%d",&a);
while(a)
{
switch(a)
{
case 1:
{
printf("请输入矩阵的阶数:\n");
scanf("%d",&n);
data=(int *)malloc(sizeof(int *)*(n*(n+1)/2));
inputsymmatrix(data,n);//输入矩阵
outputsymmatrix(data,n);
break;
}
case 2:outputsymmatrix(data,n);break;
case 3:outputdsmatrix(data,n);break;
case 4:
{
printf("请输入矩阵的阶数:\n");
scanf("%d",&n);
data=(int *)malloc(sizeof(int *)*(3*n-2));
inputThreeMatrix(data,n);
outputThreeMatrix(data,n);
break;
}
case 5: outputThreeMatrix(data,n);break;
case 6:
{
int i=0;
TTT=(TriTupleTable*)malloc(sizeof(TriTupleTable));
printf("请输入三元矩阵的行:");
scanf("%d",&TTT->data[i].i);
printf("请输入三元矩阵的列:");
scanf("%d",&TTT->data[i].j);
printf("请输入三元矩阵非零元素的个数:");
scanf("%d",&TTT->data[i].v);
inputTriTable(TTT);
outputTriTable(TTT);
break;
}
case 7:outputTriTable(TTT);break;
case 8:TransTriTable(TTT);break;
default:printf("\t\t还在紧张创作中!!!敬请期待!!!");
}
printf("\t\t请选择功能\n");
printf("\t\t温馨提示输入12可查看菜单\n");
scanf("%d",&a);
system("cls");
}
}
七、调试界面
八、总结
在编写程序时往往都是二维数组表示矩阵,然而在数值分析中经常出现一些阶数很高的的矩阵,同时在距震中有很多值相同的元素,或者是零元素,为了节省空间,可以对这类矩阵进行压缩存储,所谓的压缩存储就是,多个值相同的元之分配一个存储空间,对零元不分配空间。