数据结构-矩阵快速转置
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;
}
#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;
}
相关文章推荐
- 数据结构学习记录-矩阵的快速转置
- 【数据结构之旅】稀疏矩阵的快速转置
- 数据结构----稀疏矩阵的快速转置
- 数据结构 矩阵的快速转置 矩阵相乘(行逻辑连接顺序表)
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 数据结构----稀疏矩阵的快速转置
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置
- C++实现矩阵压缩存储与(快速)转置
- 稀疏矩阵的压缩存储以及快速转置
- 稀疏矩阵的快速转置
- sdut 1592转置矩阵【稀疏矩阵的压缩存储】【快速转置算法】
- 稀疏矩阵的快速转置
- 稀疏矩阵的压缩储存,稀疏矩阵的普通转置,稀疏矩阵的快速转置
- 稀疏矩阵快速转置
- 稀疏矩阵(实现快速转置和普通转置)
- 数据结构稀疏矩阵的实现及转置
- 矩阵的快速转置
- 三元组稀疏矩阵的快速转置
- 稀疏矩阵的快速转置