实验7、矩阵的2种转置运算 (4学时)
(1)实验目的
通过该实验,让学生理解矩阵压缩存储的概念、方法等相关知识,掌握用三元组表方式如何进行矩阵的压缩存储,并在此基础上进行转置操作,理解转置和快速转置两种矩阵转置算法的思想。
(2)实验内容
用三元组表压缩存储矩阵,实现创建矩阵、显示以及教材中介绍的两种转置算法。
(3)参考界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181202232745872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbnUxMTE=,size_16,color_FFFFFF,t_70)
(4)验收/测试用例
创建, 输入:4(行数) 4(列数) 5(非零元个数)
(1,1,1) (2,3,2) (3,1,3) (3,4,5) (4,2,4)
检查是否能拦截元素重复输入
显示
屏幕上输出
1 0 0 0
0 0 2 0
3 0 0 5
0 4 0 0
转置
屏幕上输出
1 0 3 0
0 0 0 4
0 2 0 0
0 0 5 0
参考代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#define from 12500
using namespace std;
int num1,num2,num3,num4;
typedef struct{
int i,j;
int e;
}triple;
typedef struct{
triple data[from+1];
int mu,nu,tu;
}TSMatrix;
void print(TSMatrix &M){
if(M.mu==0&&M.nu==0&&M.tu==0){
printf("该矩阵被销毁\n");
}
int p=1;
int d;
for(int a=0;a<M.mu;a++){
for(int b=0;b<M.nu;b++){
if((M.data[p].i-1)==a&&(M.data[p].j-1)==b){
d=M.data[p].e;
p++;
}else
d=0;
printf("%-4d",d);
}
cout<<endl;
}
}
void TransposeSMatrix(TSMatrix M,TSMatrix &T){
T.mu=M.mu;T.nu=M.nu;T.tu=M.tu;
int p,q,col;
if(T.tu){
q=1;
for(col=1;col<=M.nu;col++){
for(p=1;p<=M.tu;p++){
if(M.data[p].j==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;
q++;
}
}
}
}
print(T);
}
void FastTransposeSMatrix(TSMatrix M,TSMatrix &Q){
Q.mu=M.mu;Q.nu=M.nu;Q.tu=M.tu;
int p,q,t,col,*num,*cpot;
num=(int *)malloc((M.nu+1)*sizeof(int));
cpot=(int *)malloc((M.nu+1)*sizeof(int));
if(Q.tu){
for(col=1;col<=M.nu;col++)
num[col]=0;
for(t=1;t<=M.tu;t++) num[M.data[t].j]++;
cpot[1]=1;
for(col=2;col<=M.nu;col++) cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=M.tu;p++){
col=M.data[p].j;
q=cpot[col];
Q.data[q].i=M.data[p].j;
Q.data[q].j=M.data[p].i;
Q.data[q].e=M.data[p].e;
cpot[col]++;
}
}
print(Q);
}
int main()
{
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");
TSMatrix M,T,Q;
int a;
int count=0;
while(1)
{
printf("请输入功能指令:");
scanf("%d", &a);
if(a<1||a>7)
{
printf("没有此功能\n");
break;
}
if((a==1||a==10)&&count==0){
count=1;
} else if((a==1||a==10)&&count==1){
printf("请先销毁矩阵");
continue;
}
if(count!=1)
{
printf("请先创建矩阵");
continue;
}
switch(a)
{
case 1:{
num2=0;num3=0;num4=0;
cout<<"请输入行数,列数,非零元素个数"<<endl;
cin>>M.mu>>M.nu>>M.tu;
while(true){
if(M.tu>(M.mu*M.nu)){
cout<<"输入错误"<<endl;
continue;
}else{
break;
}
}
for(int i=1;i<=M.tu;i++){
cin>>M.data[i].i>>M.data[i].j>>M.data[i].e;
if(M.data[i].i>M.mu){
cout<<"输入的行大于设定的行,输入无效"<<endl;
i--;
}
if(M.data[i].j>M.nu||M.data[i].i<0){
cout<<"输入的列大于设定的列,输入无效"<<endl;
i--;
}
if(i>=2){
for(int j=1;j<i;j++){
if(M.data[i].i==M.data[j].i&&M.data[i].j<M.data[j].j){
num4=1;
break;
}
}
if(num4==1){
cout<<"重新输入"<<endl;
num4=0;
i--;
}
for(int j=1;j<i;j++){
if(M.data[i].i==M.data[j].i&&M.data[i].j==M.data[j].j){
num2=1;
break;
}
}
if(num2==1){
cout<<"重新输入"<<endl;
num2=0;
i--;
}
for(int j=1;j<i;j++){
if(M.data[i].i<M.data[j].i){
num3=1;
break;
}
}
if(num3==1){
cout<<"重新输入"<<endl;
num3=0;
i--;
}
}
}
break;
}
case 2:
M.mu=0;
M.nu=0;
M.tu=0;
printf("矩阵已被销毁\n");
break;
case 3:
printf("输出矩阵\n");
print(M);
break;
case 4:
printf("……转置矩阵……\n");
TransposeSMatrix(M,T);
break;
case 5:{
printf("……快速转置矩阵……\n");
FastTransposeSMatrix(M,Q);
break;
}
case 6:{
printf("……转置矩阵……\n");
TransposeSMatrix(M,T);
printf("……快速转置矩阵……\n");
FastTransposeSMatrix(M,Q);
break;
}
}
}
}