矩阵的2种转置运算

#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;
}
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值