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

📄 new.cpp

📁 稀疏矩阵运算器 是数据结构的一个课程设计.是自行编写的.保证是原创.
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include <stdlib.h>

#define  MAXSIZE 400 //假设非零元个数的最大值为400
typedef struct{
	int i,j;  //该非零元的行下标和列下标
	int e;
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];   //非零元三元组表,data[0]未用
	int mu,nu,tu;           //矩阵的行数、列数和非零元个数。
}TSMatrix;

void CreateTSMatrix(TSMatrix &M,int m,int n,int k)   //根据三元组的行数、列数、非零个数建立三元组
{int i;
 M.mu=m;       //定义三元组的行、列、和非零个数
 M.nu=n;
 M.tu=k;
 for(i=1;i<=k;i++)   //根据非零个数的多少,循环输入三元组
 {
	cout<<"请输入第"<<i<<"个非零元,格式为(x,y,z)"<<endl;
    scanf("%d,%d,%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
 }
}

void AddTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y)  //三元组矩阵加法运算,Y=M+T;
{
Y.mu=M.mu;     //定义相加结果的行、列个数
Y.nu=M.nu;

for(int i=1;i<=M.tu;i++)  //把矩阵M复制到结果Y
{
  Y.data[i].i=M.data[i].i;
  Y.data[i].j=M.data[i].j;
  Y.data[i].e=M.data[i].e;
}
int m=0,k=M.tu;          
for(i=1;i<=T.tu;i++)      //读取矩阵T的元素,
{
for(int j=1;j<=M.tu;j++)
{
if(T.data[i].i==Y.data[j].i && T.data[i].j==Y.data[j].j)  //如果所在行数和列数相同,即把两结果相加。
{Y.data[j].e=Y.data[j].e+T.data[i].e;m=1;}
}
if(m==0){++k; Y.data[k].i=T.data[i].i;Y.data[k].j=T.data[i].j;Y.data[k].e=T.data[i].e;}else{m=0;}//如果所在行数和列数不同,即把它添加进矩阵Y。
}
Y.tu=k;
}

void SubTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y)  //三元组矩阵减法运算,Y=M-T;减法同加法的算法类似,这里不再说明。
{
Y.mu=M.mu;
Y.nu=M.nu;

for(int i=1;i<=M.tu;i++)
{
  Y.data[i].i=M.data[i].i;
  Y.data[i].j=M.data[i].j;
  Y.data[i].e=M.data[i].e;
}
int m=0,k=M.tu;
for(i=1;i<=T.tu;i++)
{
for(int j=1;j<=M.tu;j++)
{
if(T.data[i].i==Y.data[j].i && T.data[i].j==Y.data[j].j)
{Y.data[j].e=Y.data[j].e-T.data[i].e;m=1;}
}
if(m==0){++k; Y.data[k].i=T.data[i].i;Y.data[k].j=T.data[i].j;Y.data[k].e=T.data[i].e;}else{m=0;}
}
Y.tu=k;
}

 
void MUlTSMatrix(TSMatrix &M,TSMatrix &T,TSMatrix &Y) //三元组乘法运算。Y=M*T
{
 int i,k=1,flag=0;  //i为计数器,K为矩阵Y的第一个元素。
 Y.mu=M.mu;   //根据乘法定义,结果Y的行为第一个矩阵的行,列为第二个矩阵的列。
 Y.nu=T.nu;
 Y.tu=0;      //Y的初始非零元为零。
 for(i=1;i<=M.tu;i++)  //逐个读取矩阵M中非零元。
 {
 for(int j=1;j<=T.tu;j++)  //逐个读取矩阵T中的非零元。
 {if(M.data[i].j==T.data[j].i ){//如果M中第i个元素的列与T中第j个元素的行相等。
     for(int m=1;m<=k;m++){    //检查Y中是否存在第i行第j列的元素
	 if(Y.data[m].i==M.data[i].i && Y.data[m].j==T.data[j].j)//如果存在,即把M与T的元相乘再加到这个元素上。
	 {Y.data[m].e=Y.data[m].e+M.data[i].e*T.data[j].e;flag=1;//此时判参数flag=1;
	 }  
	 }
   if(flag==0){ Y.data[k].e=M.data[i].e*T.data[j].e; Y.data[k].i=M.data[i].i;Y.data[k].j=T.data[j].j;k++;}//如果Y中不存在此元,即把结果添加到Y中,此时Y中的非零元加1。
   flag=0;  
 }
 }
 }
Y.tu=k-1;  //因为初值是K=1,所以现在减1才是真正Y的非零元个数。
}

int input(TSMatrix &M,TSMatrix &T)      //三元组M和T的设定建立函。
{
int m1,m2,n1,n2,k1,k2;
cout<<"请输入第一个距阵的行和列和非零元个数,如(x,y,z)"<<endl;  //根据所给出的三元组行、列和非零元个数,循环输入到三元组中。
scanf("%d,%d,%d",&m1,&n1,&k1);
if(m1<1 || n1<1 || k1<0){cout<<"你的输入有错!!!"<<endl;return 0;}
printf("请输入第一个距阵信息:\n");
CreateTSMatrix(M,m1,n1,k1);
cout<<"请输入第二个距阵的行和列和非零元个数,如(x,y,z)"<<endl;
scanf("%d,%d,%d",&m2,&n2,&k2);
if(m2<1 || n2<1 || k2<0){cout<<"你的输入有错!!!"<<endl;return 0;}
printf("请输入第二个距阵信息:\n");
CreateTSMatrix(T,m2,n2,k2);
return 1;
}
 

void print(TSMatrix &Y)  //以矩阵形式输出三元组
{
int i,j,p=1;
for(i=1;i<=Y.mu;i++)    
{
for(j=1;j<=Y.nu;j++)
{
if(i==Y.data[p].i && j==Y.data[p].j){ printf("%5d",Y.data[p].e);p++;}//如果此元存在,即直接输出,
else
printf("%5d",0);//不存在保零。
}
printf("\n"); //矩阵换行。
}
}
 
void main(){

TSMatrix M;         //定义三个三元组结构,用于存放矩阵。
TSMatrix T;
TSMatrix Y;
int choice;                  //主界面
cout<<"-----------------------------------------------------------------------"<<endl;  
cout<<"__________________________稀疏矩阵运算器_______________________________"<<endl;
cout<<"                                                                       "<<endl;
cout<<endl;                                                             
do{
cout<<endl;
cout<<"-----------------------------------------------------------------------"<<endl;
cout<<"                          <1> 矩阵加法                                 "<<endl;
cout<<"                          <2> 矩阵减法                                 "<<endl;
cout<<"                          <3> 矩阵乘法                                 "<<endl;
cout<<"                          <4> 退出系统                                 "<<endl<<endl;
cout<<"_______________________________________________________________________"<<endl;
cout<<"您的选择:";
cin>>choice;
switch(choice)    //各菜单项
{
case 1:{input(M,T); if(M.mu!=T.mu && M.nu!=T.nu){cout<<"你的输入有错,返回!!!"<<endl; break;} else {AddTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<"         +"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl;} //矩阵加法
	break;}
case 2:{input(M,T); if(M.mu!=T.mu && M.nu!=T.nu){cout<<"你的输入有错,返回!!!"<<endl; break;} else {SubTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<"         -"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl;} //矩阵减法
	break;}
case 3:{input(M,T); if(M.nu!=T.mu){cout<<"你的输入有错,返回!!!"<<endl; break;}else {MUlTSMatrix(M,T,Y);cout<<endl;print(M); cout<<endl<<"         *"<<endl<<endl;print(T);cout<<endl;print(Y);cout<<endl; }  //矩阵乘法
	break;}
case 4:exit(0);   //退出系统
break;
default: printf("\n你的选择有错,请重新选择!!!");  
}/*switch*/
}while(choice!='4');    //选择有错时自动返回

}



⌨️ 快捷键说明

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