#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");

           };
 }
}