#include<stdio.h>
#include <stdlib.h>
static Upper_triangular_matrix (int n)
{
int i,j,k,z,g;
int L[100][100],SA[100];
printf("请输入您要压缩矩阵的行列数\n");
scanf("%d",&n);
printf("请输入您的矩阵内元素:\n");
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
{
scanf("%d",&L[i][j]);
if(i<=j)
k=j*(j-1)/2+i-1;
else
k=n*(n+1)/2;
SA[k]=L[i][j];
}
printf("您输入的矩阵为:\n");
for(i=1;i<n+1;i++)
{for(j=1;j<n+1;j++)
printf("%d ",L[i][j]);
printf("\n");
}
printf("压缩存储后:\n");
for(k=0;k<n*(n+1)/2+1;k++)
printf("%d %d\n",k,SA[k]);
printf("若要读取矩阵的值请输入'100'退出输入'000'。\n");
scanf("%d",&z);
while(z==100)
{
printf("请您输入未压缩时所在行数:\n");
scanf("%d",&i);
printf("请您输入未压缩时所在列数:\n");
scanf("%d",&j);
if(i<=j)
k=j*(j-1)/2+i-1;
else
k=n*(n+1)/2;
printf("该地址的值为:\n");
printf("%d \n",SA[k]);
z=1;
printf("继续请输入'100'退出输入'000'。\n");
scanf("%d",&z);
}
}
static Symmetric_matrix(int n)
{
int i,j,k,z,g;
int L[100][100],SA[100];
printf("请输入您要压缩矩阵的行列数\n");
scanf("%d",&n);
printf("请输入您的矩阵内元素:\n");
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
{
scanf("%d",&L[i][j]);
if(i>=j)
k=i*(i-1)/2+j-1;
else
k=j*(j-1)/2+i-1;
SA[k]=L[i][j];
}
printf("您输入的矩阵为:\n");
for(i=1;i<n+1;i++)
{for(j=1;j<n+1;j++)
printf("%d ",L[i][j]);
printf("\n");
}
printf("压缩存储后:\n");
for(k=0;k<n*(n+1)/2;k++)
printf("%d %d\n",k,SA[k]);
printf("若要读取矩阵的值请输入'100'退出输入'000'。\n");
scanf("%d",&z);
while(z==100)
{
printf("请您输入未压缩时所在行数:\n");
scanf("%d",&i);
printf("请您输入未压缩时所在列数:\n");
scanf("%d",&j);
if(i>=j)
k=i*(i-1)/2+j-1;
else
k=j*(j-1)/2+i-1;
printf("该地址的值为:\n");
printf("%d \n",SA[k]);
z=1;
printf("继续请输入'100'退出输入'000'。\n");
scanf("%d",&z);
}
}
static Lower_triangular_matrix(int n)
{
int i,j,k,z,g;
int L[100][100],SA[100];
printf("请输入您要压缩矩阵的行列数\n");
scanf("%d",&n);
printf("请输入您的矩阵内元素:\n");
for(i=1;i<n+1;i++)
for(j=1;j<n+1;j++)
{
scanf("%d",&L[i][j]);
if(i>=j)
k=i*(i-1)/2+j-1;
else
k=n*(n+1)/2;
SA[k]=L[i][j];
}
printf("您输入的矩阵为:\n");
for(i=1;i<n+1;i++)
{for(j=1;j<n+1;j++)
printf("%d ",L[i][j]);
printf("\n");
}
printf("压缩存储后:\n");
for(k=0;k<n*(n+1)/2+1;k++)
printf("%d %d\n",k,SA[k]);
printf("若要读取矩阵的值请输入'100'退出输入'000'。\n");
scanf("%d",&z);
while(z==100)
{
printf("请您输入未压缩时所在行数:\n");
scanf("%d",&i);
printf("请您输入未压缩时所在列数:\n");
scanf("%d",&j);
if(i>=j)
k=i*(i-1)/2+j-1;
else
k=n*(n+1)/2;
printf("该地址的值为:\n");
printf("%d \n",SA[k]);
z=1;
printf("继续请输入'100'退出输入'000'。\n");
scanf("%d",&z);
}
}
int main()
{
int n,d;
int m;
printf("***************************特殊矩阵的压缩存储*************************\n") ;
printf(" 1:Symmetric_matrix \n");
printf(" 2:Upper_triangular_matrix\n");
printf(" 3: Lower_triangular_matrix\n");
for(d=0;d<100;d++)
{ printf("请选择您要存储的特殊矩阵类型:\n");
printf("退出请输入'101'\n");
scanf("%d",&m);
if(m==101)
break;
else
switch(m)
{
case 1: Symmetric_matrix (n);break;
case 2: Upper_triangular_matrix(n);break;
case 3: Lower_triangular_matrix(n);break;
default: printf("对不起您输入的选号错误。\n");
};
}
}