#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 12500
typedef int ElemType;
typedef struct {
int i,j; //i是行 ,j是列
ElemType e;
} Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu; //mu行 nu列 tu非零元个数
} TSMatrix;
//创建矩阵
int CreatSMatrix(TSMatrix &m) {
int i,j,k;
ElemType e;
int x;
cout<<"请输入矩阵的行数,列数,非零元个数:"<<endl;
cin>>(&m)->mu>>(&m)->nu>>(&m)->tu;
if(m.tu>m.mu*m.nu) {
cout<<"非零元个数超出该矩阵容量!"<<endl;
cout<<"创建失败!"<<endl;
return ERROR;
} else if(m.tu==0) {
cout<<"非零元个数为零,该矩阵无意义!"<<endl;
cout<<"创建失败!"<<endl;
return ERROR;
}
m.data[0].i=0;
for(i=1; i<=m.tu; i++) {
do {
cout<<"请按行序输入第"<<i<<"个非零元素的行(1~"<<m.mu <<"),";
cout<<"列(1~"<<m.nu<<"),元素值:"<<endl;
cin>>j>>k>>e;
x=0;
if(j<1 || j>m.mu || k<1 || k>m.nu) {
cout<<"输入元素的行列值超出范围!请重新输入。"<<endl;
x=1;
}
if(j<m.data[i-1].i || j==m.data[i-1].i && k<=m.data[i-1].j) {
cout<<"行列值输入错误!请重新输入。"<<endl;
x=1;
}
} while(x);
m.data[i].i=j;
m.data[i].j=k;
m.data[i].e=e;
}
cout<<"创建成功!"<<endl;
return OK;
}
//销毁矩阵
int DestroySMatrix(TSMatrix &m) {
(&m)->mu=0;
(&m)->nu=0;
(&m)->tu=0;
return OK;
}
//输出矩阵M
int PrintSMatrix(TSMatrix m) {
cout<<"该矩阵共"<<m.mu<<"行,"<<m.nu<<"列,"<<m.tu<<"个非零元素。"<<endl;
int n=1;
for(int i=1; i<=m.mu; i++){
for(int j=1;j<=m.nu;j++){
if(n<=m.tu){
if(m.data[n].i==i && m.data[n].j==j) {
cout<<m.data[n].e<<" ";
n++;
}
else cout<<0<<" ";
}
else cout<<0<<" ";
}
cout<<endl;
}
return OK;
}
//转置矩阵
int TransposeSMatrix(TSMatrix m,TSMatrix &t) {
int p,q,loc;
t.mu=m.nu;
t.nu=m.mu;
t.tu=m.tu;
if(t.tu) {
q=1;
for(loc=1; loc<=m.nu; ++loc) {
for(p=1; p<=m.tu; ++p) {
if(m.data[p].j==loc) {
t.data[q].i=m.data[p].j;
t.data[q].j=m.data[p].i;
t.data[q].e=m.data[p].e;
++q;
}
}
}
}
cout<<"转置后的矩阵为:"<<endl;
PrintSMatrix(t);
return OK;
}
//快速转置矩阵
int STransposeSMatrix(TSMatrix m,TSMatrix &t) {
int p,q,f,loc,*num,*cpot;
num=(int*)malloc((m.nu+1)*sizeof(int));
cpot=(int*)malloc((m.nu+1)*sizeof(int));
t.mu=m.nu;
t.nu=m.mu;
t.tu=m.tu;
if(t.tu) {
for(loc=1; loc<=m.nu; ++loc) num[loc]=0;
for(f=1; f<m.tu; ++f) ++num[m.data[f].j];
cpot[1]=1;
for(loc=2; loc<=m.tu; ++loc) cpot[loc]=cpot[loc-1]+num[loc-1];
for(p=1; p<=m.tu; ++p) {
loc=m.data[p].j;
q=cpot[loc];
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[loc];
}
}
free(num);
free(cpot);
cout<<"转置后的矩阵为:"<<endl;
PrintSMatrix(t);
return OK;
}
//转置矩阵对比
int CompareSMatrix(TSMatrix m,TSMatrix t) {
cout<<"转置前的矩阵为:"<<endl;
PrintSMatrix(m);
cout<<"转置后的矩阵为:"<<endl;
PrintSMatrix(t);
return OK;
}
int main() {
cout<<"可执行操作有:" <<endl;
cout<<"*****************************************"<<endl;
cout<<"************* 1.创建矩阵 ***********"<<endl;
cout<<"************* 2.销毁矩阵 ***********"<<endl;
cout<<"************* 3.输出矩阵M ***********"<<endl;
cout<<"************* 4.转置矩阵 ***********"<<endl;
cout<<"************* 5.快速转置矩阵 ***********"<<endl;
cout<<"************* 6.转置矩阵对比 ***********"<<endl;
cout<<"************* 7.退出 ***********"<<endl;
cout<<"*****************************************"<<endl;
cout<<endl<<"请输入你的选择:";
int num;
TSMatrix m,t;
(&m)->tu=0;
(&t)->tu=0;
while( (cin>>num) != 0 ) {
switch(num) {
case 1:
if(m.tu!=0) {
cout<<"矩阵已创建!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else{
CreatSMatrix(m);
cout<<endl<<"请输入你的选择:";
break;
}
case 2:
if(m.tu==0) {
cout<<"矩阵不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
DestroySMatrix(m);
cout<<"销毁成功!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
}
case 3:
if(m.tu==0) {
cout<<"矩阵不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
PrintSMatrix(m);
cout<<endl<<"请输入你的选择:";
break;
}
case 4:
if(m.tu==0) {
cout<<"矩阵不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
TransposeSMatrix(m,t);
cout<<endl<<"请输入你的选择:";
break;
}
case 5:
if(m.tu==0) {
cout<<"矩阵不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
STransposeSMatrix(m,t);
cout<<endl<<"请输入你的选择:";
break;
}
case 6:
if(m.tu==0) {
cout<<"矩阵不存在!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else if(t.tu==0){
cout<<"矩阵未经过转置!"<<endl;
cout<<endl<<"请输入你的选择:";
break;
} else {
CompareSMatrix(m,t);
cout<<endl<<"请输入你的选择:";
break;
}
case 7:
return 0;
default:
cout<<"该数据无效,请重新输入:";
break;
}
}
return 0;
}
矩阵的2种转置运算
最新推荐文章于 2024-06-08 12:57:43 发布