您的位置:首页 > 理论基础 > 数据结构算法

数据结构-矩阵快速转置

2017-12-20 21:24 330 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: