数据结构-矩阵快速转置

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000
#define OK 1
#define ERROR 0
int matrix[100][100];
int flag=0;
typedef struct
{
 int i,j;
 int e;
 }Triple;
typedef struct
{
 Triple data[MAXSIZE+1];
 int mu,nu,tu;
 }TSMatrix;
int DestroyMatrix(TSMatrix &M);
int CreatMatrix(TSMatrix &M);
int PrintMatrix(TSMatrix M);
int TransMatrix(TSMatrix M);
int FastTransMatrix(TSMatrix M);
int ShowMatrix(TSMatrix M);
void show();

int main()
{
 int n,n1,n2,n3;
 TSMatrix M;
 show();
 do
 {
 
  
  scanf("%d",&n);
  switch(n)
  {
   case 1:{
    CreatMatrix(M);
    break;
   }
   case 2:{
    if(flag)
    {
     DestroyMatrix(M);
    }
    else
    printf("操作不合法!\n");
    break;
   }
   case 3:{
    if(flag)
    {
     printf("该矩阵为:\n");
     PrintMatrix(M);
    }
    else
    printf("操作不合法!\n");
    break;
   }
   case 4:{
    if(flag)
    {
     TransMatrix(M);
    }
    else
    printf("操作不合法!\n");
    break;
   }
   case 5:{
    if(flag)
    {
     FastTransMatrix(M);
    }
    else
    printf("操作不合法!\n");
    break;
   }
   case 6:{
    if(flag)
    {
     ShowMatrix(M);
    }
    else
    printf("操作不合法!\n");
    break;
   }
   case 7:{
    exit(0);
    break;
   }
   default :{
    printf("操作不合法!\n");
    break;
   }
  }
 printf("请继续:\n"); 
 }while(1);
 
 return 0;
}



void show()
{
 printf("可执行操作有:\n");
 printf("****************************************************************************\n");
 printf("**********                1.创建矩阵                             **********\n");
 printf("**********                2.销毁矩阵                             **********\n");
 printf("**********                3.输出矩阵M                            **********\n");
 printf("**********                4.转置矩阵                             **********\n");
 printf("**********                5.快速转置矩阵                         **********\n");
 printf("**********                6.转置矩阵对比                         **********\n");
 printf("**********                7.退出                                 **********\n");
 printf("***************************************************************************\n");
}


int CreatMatrix(TSMatrix &M)
{
 int x,i,j;
 M.data[0].i=1;
 for(i=0;i<100;i++)
 {
  for(j=0;j<100;j++)
  matrix[i][j]=0;
 }
 printf("请输入矩阵的行、列、非零元数目:\n");
 scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
 if(M.tu>1000)
 {
  printf("输入不合法!\n");
  return ERROR;
 }
 if(M.mu*M.nu<M.tu)
 {
  printf("输入不合法!\n");
  return ERROR;
 }
 if(M.mu<1||M.nu<1)
 {
  printf("输入不合法!\n");         
  return ERROR;
 }
 if(M.tu==0)
 {
  flag=1;
  return OK;
 }
 printf("请输入非零元素的位置和相应的数值:\n");
 for(x=1;x<=M.tu;x++)
 {
  scanf("%d%d%d",&M.data[x].i,&M.data[x].j,&M.data[x].e);
  if(M.data[x].i>M.mu||M.data[x].j>M.nu)
  {
   printf("输入不合法!\n");
   DestroyMatrix(M);           
   return ERROR;
  }
  matrix[M.data[x].i][M.data[x].j]++;           
  if(matrix[M.data[x].i][M.data[x].j]==2)     
  {
   printf("输入不合法!\n");
   DestroyMatrix(M);
   return ERROR;
  }
  if(M.data[x].i<M.data[x-1].i)    
  {
   printf("输入不合法!\n");
   DestroyMatrix(M);
   return ERROR;
  }
  if(M.data[x].e==0)           
  {
   printf("输入不合法!\n");
   DestroyMatrix(M);
   return ERROR;
  }
 }
 flag=1;
 return OK;
}
int DestroyMatrix(TSMatrix &M)
{
 M.mu=0;
 M.nu=0;
 M.tu=0;
 flag=0;
 printf("矩阵已销毁!\n");
 return OK;
}

int PrintMatrix(TSMatrix M)
{
 int x,q=1,y;
 for(x=1;x<=M.mu;x++)
 {
  for(y=1;y<=M.nu;y++)
  {
   if(x==M.data[q].i&&y==M.data[q].j)
   {
    printf("%d\t",M.data[q].e);
    q++;
    continue;
   }
   printf("0\t");
  }
  printf("\n");
 }
 return OK;
}
int TransMatrix(TSMatrix M)
{
 TSMatrix T;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 int i,j,q=1;
 for(i=1;i<=M.nu;i++)
 {
  for(j=1;j<=M.tu;j++)
  {
   if(M.data[j].j==i)
   {
    T.data[q].i=M.data[j].j;
    T.data[q].j=M.data[j].i;
    T.data[q].e=M.data[j].e;
    q++;
   }
  }
 }
 printf("转置后矩阵为:\n");
 PrintMatrix(T);
 return 0;
}
int FastTransMatrix(TSMatrix M)
{
 TSMatrix T;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 int num[1000]={0};
 int cpot[1000];
 int i,q;
 for(i=1;i<=M.tu;i++)
 num[M.data[i].j]++;
 cpot[1]=1;
 for(i=2;i<=M.nu;i++)
 cpot[i]=cpot[i-1]+num[i-1];
 for(i=1;i<=M.tu;i++)
 {
  q=cpot[M.data[i].j];
  T.data[q].i=M.data[i].j;
  T.data[q].j=M.data[i].i;
  T.data[q].e=M.data[i].e;
  cpot[M.data[i].j]++;
  }
 printf("转置矩阵为:\n");
 PrintMatrix(T);
 return OK;
}
int ShowMatrix(TSMatrix M)
{
 printf("原矩阵:\n");
 PrintMatrix(M);
 FastTransMatrix(M);
 return OK;
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderkou97

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值