⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cpp

📁 稀疏矩阵运算器 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵
💻 CPP
字号:
#include <iostream>
using namespace std;
#include "stdio.h" 
#include "conio.h"

typedef int Status;
typedef int ElemType;//类型定义
#define MAXSIZE 20
typedef struct{
	int i,j;
	ElemType e;
}Triple;
#define MAXMN 10
typedef struct{
	Triple data[MAXSIZE+1];
	int rpos[MAXMN+1];
	int r,c,z;//矩阵的行,列,非零数
}RLSMatrix;
void InitSMatrix(RLSMatrix &m){  //初始化矩阵
	m.r=m.c=m.z=0;
}

void Setrpos(RLSMatrix &m){
	for(int k=1;k<=m.z;k++)
	{		
		if(m.rpos[m.data[k].i]==0)
		m.rpos[m.data[k].i]=k;
	}
}//把每一行第一个非零数的位置保存到m.rpos

void InsertElem(RLSMatrix &m,int cur,int row,int col,ElemType e){	
	m.data[cur].i=row;
	m.data[cur].j=col;
	m.data[cur].e=e;
}//输入元素

void Equal(Triple &ea,Triple &eb){	
	ea.i=eb.i;ea.j=eb.j;ea.e=eb.e;
}//赋值

Status SortElem(RLSMatrix &m,int cur){	
	if(m.z==1||m.z==0) return 1;
	Triple temp;
	Equal(temp,m.data[cur]);
	while(temp.i<m.data[cur].i||temp.j<m.data[cur].j){
		Equal(m.data[cur],m.data[cur-1]);
		Equal(m.data[cur-1],temp);
		--cur;
		if(cur==1) return 1;
	}
	return 0;
}//排序


Status CreateSMatrix(RLSMatrix &m){	
	
	InitSMatrix(m);	
	do{
		printf("\n输入矩阵的行列和非零个数(逗号分隔)\n");
		printf("行,列,非零数:");
		scanf("%d,%d,%d",&m.r,&m.c,&m.z);
		if(m.z>m.r*m.c){
			printf("非零数超出范围,重新输入!");
			continue;
		}
	}while(m.z>m.r*m.c);//输入矩阵行列和非零个数
	
	for(int k1=1;k1<=m.r;k1++)
		m.rpos[k1]=0;
	for(int k2=1;k2<=m.z;k2++)
		m.data[k2].e=0;	//初始化
	int curelemnum=1;
	int row,col;
	ElemType E;
	bool isExist;	
		
	printf("请输入非零元素:\n");//一共需要输入m.z个元素
	while(curelemnum<=m.z){  
		isExist=false;
		printf("行,列,值:");
		scanf("%d,%d,%d",&row,&col,&E);	
		if(curelemnum>1){
			for(int k4=1;k4<curelemnum;k4++){
				if(m.data[k4].i==row&&m.data[k4].j==col){
					printf("该行列已经存在!请重新输入!\n");
					isExist=true;
					break;
				}
			}
		}
		if(isExist) continue;
		
		InsertElem(m,curelemnum,row,col,E);	//插入元素
				
		SortElem(m,curelemnum);//排序
		++curelemnum;
	}	
	Setrpos(m);
	return 1;
}//创建矩阵

void PrintSMatrix(RLSMatrix m){
	int index=1;
	for(int i=1;i<=m.r;i++){
		for(int j=1;j<=m.c;j++){
			if(m.data[index].i==i&&m.data[index].j==j)
				printf("%3d",m.data[index++].e);
			else
				printf("%3d",0);
		}
		printf("\n");
	}
}//输出矩阵

ElemType CheckElem(RLSMatrix m,int row,int col){	
	for(int k=1;k<=m.z;k++)
		if(m.data[k].i==row&&m.data[k].j==col)
			return m.data[k].e;
	return 0;
}//当前位置为非零元素,则返回值,否则返回0

Status AddSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){
	if(m.r!=n.r||m.c!=n.c){
		printf("ERROR行列数不对!\n"); 
		return 0;}//判断m,n的行列数是否相等
	InitSMatrix(p);
	p.r=m.r;p.c=m.c;p.z=0;
	ElemType e;
	for(int i=1;i<=m.r;i++)
		for(int j=1;j<=m.c;j++){
			e=0;
			e+=CheckElem(m,i,j)+CheckElem(n,i,j);
			if(e){
				p.data[++p.z].i=i;
				p.data[p.z].j=j;
				p.data[p.z].e=e;
			}
		}
	return 1;
}//矩阵加法

Status SubSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){
	for(int i=1;i<=n.z;i++)
		n.data[i].e*=-1;
	
	if(!(AddSMatrix(m,n,p))) return 0;
	return 1;
}//矩阵减法	


Status MultSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){	
	if(m.c!=n.r) return 0;
	InitSMatrix(p);	
	p.r=m.r;p.c=n.c;
	p.z=0;
	int temp=m.c;
	ElemType e;	
	
	for(int i=1;i<=p.r;i++)
		for(int j=1;j<=p.c;j++){
			e=0;
			for(int k=1;k<=temp;k++)
				e+=CheckElem(m,i,k)*CheckElem(n,k,j);
			if(e){
				p.data[++p.z].i=i;
				p.data[p.z].j=j;
				p.data[p.z].e=e;
			}
		}
	return 0;
}//矩阵乘法

void Menu(){
	printf("***************MENU***************\n");
	printf("请选择所想要进行的操作!\n");
	printf("1.矩阵相加\n");
	printf("2.矩阵相减\n");
	printf("3.矩阵相乘\n");
	printf("4.退出\n");
	printf("**********************************\n");
}

void InputSMatrix(RLSMatrix &m){
	printf("请输入矩阵:");
	CreateSMatrix(m);
	printf("\n");
	printf("输入的矩阵为:");
	printf("\n");
	PrintSMatrix(m);
	printf("\n");
}

void main(){
	int select;
	RLSMatrix A,B,C;
	do{
		Menu();
		scanf("%d",&select);

		switch(select){
		case 1:
			InputSMatrix(A);
			InputSMatrix(B);
			
		    if(AddSMatrix(A,B,C))
			{
			    printf("矩阵相加的结果:\n");
			    PrintSMatrix(C);
			    printf("\n");
			}break;
		
		case 2:
			InputSMatrix(A);
			InputSMatrix(B);
			
			if(SubSMatrix(A,B,C)){
			printf("矩阵相减的结果:\n");
			PrintSMatrix(C);
			printf("\n");}break;
		
		case 3:
			InputSMatrix(A);
			InputSMatrix(B);
			MultSMatrix(A,B,C);
			printf("矩阵相乘的结果:\n");
			PrintSMatrix(C);
			printf("\n");break;
		
		case 4:
			system("cls");
			printf("按任意键退出");
			getch();
			return;
		default:cout<<"输入错误,请重新选择!!"<<endl;
			break;
		}
	}while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -