压缩矩阵的转置
#include"stdio.h"
#include"stdlib.h"
#define OK 1
#define ERROR -1
#define OVERFLOW -2
typedef int Status;
typedef int Elem;
#define MAXSIZE 100
typedef struct{
int i, j;
Elem e;
}Triple;
typedef struct{
Triple data[MAXSIZE + 1];
int mu, nu, tu;
}TMatrix;
Status CreateTMatrix(TMatrix &M);
Status DestoryTMatrix(TMatrix &M);
Status PrintTMatrix(TMatrix &M);
Status TransposeTMatrix(TMatrix M, TMatrix &T);
Status FastTransposeTMatrix(TMatrix M, TMatrix &T);
void menu()
{
printf("1-----创建矩阵\n");
printf("2-----销毁矩阵\n");
printf("3-----输出矩阵\n");
printf("4-----转置矩阵\n");
printf("5-----快速转置矩阵\n");
printf("-----退出输出一个负数!\n");
}
int main()
{
int i = 0;
TMatrix M;
TMatrix T;
int choice;
while (1){
menu();
printf("请输入你要进行的操作:");
scanf("%d", &choice);
if (choice <= 0){
printf("退出成功\n");
return 0;
}
switch (choice)
{
case 1:
{
i = CreateTMatrix(M);
if (i == 1)
{
printf("创建成功\n");
}
break;
}
case 2:
{
i = DestoryTMatrix(M);
if (i == 1)
{
printf("销毁成功\n");
}
break;
}
case 3:
{
i = PrintTMatrix(M);
break;
}
case 4:
{
{
printf("转置前:\n");
i = PrintTMatrix(M);
i = TransposeTMatrix(M, T);
printf("转置后:\n");
i = PrintTMatrix(T);
}
break;
}
case 5:
{
{
printf("快速转置前:\n");
i = PrintTMatrix(M);
i = FastTransposeTMatrix(M, T);
printf("快速转置后:\n");
i = PrintTMatrix(T);
}
break;
}
default:
{
printf("选择失败,请重新选择!\n");
break;
}
}
}
return 0;
}
Status CreateTMatrix(TMatrix &M)
{
M.data[0].i = M.data[0].j = 0;
int num = 1;
while (1)
{
printf("请输入矩阵的行数,列数和非零元个数:\n");
scanf("%d", &M.mu);
scanf("%d", &M.nu);
scanf("%d", &M.tu);
if (M.nu*M.mu<M.tu)
{
printf("输入错误,非零元素个数要小于等于行数乘以列数,请从新输入!\n");
continue;
}
else
{
printf("矩阵规模限定成功\n");
break;
}
}
while (num <= M.tu)
{
printf("请输入第%d个元素的行下标,列下标和元素值(按行序输入,且下标递增):\n", num);
scanf("%d%d%d", &M.data[num].i, &M.data[num].j, &M.data[num].e);
if (M.data[num].i<M.data[num - 1].i)
{
printf("该元素行下标输入错误,请重新输入\n");
}
else if (M.data[num].i == M.data[num - 1].i){
if (M.data[num].j <= M.data[num - 1].j || M.data[num].j>M.nu){
printf("该元素下标输入错误,请重新输入\n");
}
else{
num++;
}
}
else if (M.data[num].i>M.mu){
printf("该元素行下标输入错误,请重新输入\n");
}
else{
if (M.data[num].j >= 1 && M.data[num].j <= M.nu){
num++;
}
else{
printf("该元素列下标输入错误,请重新输入\n");
}
}
}
return OK;
}
Status DestoryTMatrix(TMatrix &M)
{
M.mu = 0;
M.nu = 0;
M.tu = 0;
return OK;
}
Status PrintTMatrix(TMatrix &M)
{
int num = 1;
for (int row = 1; row <= M.mu; row++)
{
for (int col = 1; col <= M.nu; col++)
{
if (col == M.data[num].i && row == M.data[num].j)
{
printf("%d", M.data[num].e);
num++;
}
else{
printf("0");
}
printf(" ");
if (col == M.nu){
printf("\n");
}
}
}
return OK;
}
Status TransposeTMatrix(TMatrix M, TMatrix &T)
{
int num = 1;
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
if (T.tu)
{
for (int col = 0; col <= M.nu; col++)
{
for (int sum = 1; sum <= M.tu; sum++)
{
if (M.data[sum].j == col){
T.data[num].i = M.data[sum].j;
T.data[num].j = M.data[sum].i;
T.data[num].e = M.data[num].e;
num++;
}
}
}
}
return OK;
}
Status FastTransposeTMatrix(TMatrix M, TMatrix &T)
{
T.mu = M.nu;
T.nu = M.mu;
T.tu = M.tu;
int q = 0;
int col = 0;
int num[MAXSIZE + 1];
int cpot[MAXSIZE + 1];
for (int col = 1; col <= M.mu; col++)
{
num[col] = 0;
}
for (int t = 1; t <= M.tu; t++)
{
num[M.data[t].j]++;
}
cpot[1] = 1;
for (int col = 2; col <= M.nu; col++)
{
cpot[col] = cpot[col - 1] + num[col - 1];
}
for (int p = 1; p <= M.tu; p++)
{
col = M.data[p].j;
q = cpot[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
cpot[col]++;
}
return OK;
}