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

📄 1111.cpp

📁 稀疏矩阵的运算
💻 CPP
字号:
#include<iostream>
using namespace std;
template<class T>
struct term
{
	int row,col;
	T value;	
};
template<class T>
class seqtriple
{
	public:
		seqtriple(int msize=0);
	   ~seqtriple(){delete[]trip;}
	  int gett(){return t;}
	   void add(seqtriple<T> &b,seqtriple<T> &c);
       void sub(seqtriple<T> &b,seqtriple<T> &c);
	   void mul(seqtriple<T> &B,seqtriple<T> &C);
	  void transpose(seqtriple<T> &B);
	  void input(istream &in);
	  void output(ostream &out);
	   friend istream &operator >> (istream &in,seqtriple<T>&x);
	   friend ostream &operator << (istream &out, seqtriple<T>&x);
	   private:
		   int maxsize;    //最大元素个数
		   int m,n,t;        //稀疏矩阵的行数,列数和非元素个数
		   term<T>*trip; 
};
template<class T>
seqtriple<T>::seqtriple( int msize)//构造函数
{
	m=n=t=0;
	maxsize=msize;
	trip=new term<T>[maxsize];//动态分配顺序表的储存空间
}
template<class T>
void seqtriple<T>::input(istream &in)//输入
{
 cout<<"请按顺序输入稀疏矩阵各个非零元素,以列序为主"<<endl;

             
 int k;
 cout<<"输入稀疏矩阵非0元素的个数"<<endl;
			  
 in>>k;
     t=k;         
	cout<<"请输入行数"<<endl;
	in>>m;
  cout<<"请输入列数"<<endl;
  in>>n;
	for(int a=1;a<=t;a++)
	{  
		cout<<"请输该元素所在入列数,行数和该元素的数值"<<endl;
		
 
		in>>trip[a].row;
		if(trip[a].row>=m)
		{cout<<"输入不正确,请重新输入"<<endl;
		in>>trip[a].row;}

		in>>trip[a].col;
if(trip[a].row>=m)
		{cout<<"输入不正确,请重新输入"<<endl;
		in>>trip[a].col;}
			in>>trip[a].value;
	}
}
template<class T>
void seqtriple<T>::output(ostream &out) //输出
{  cout<<"======================"<<endl;
cout<<"请按顺序输出稀疏矩阵各个非零元素,以行序为主"<<endl;
 	 cout<<"   行数       列数      数值"<<endl;
	for(int a=1;a<=t;a++)
		{
		 out<<"(     "<<trip[a].row<<"         "<<trip[a].col<<"        "<<trip[a].value<<")"<<endl;    
	}
}
template<class T>
void seqtriple<T>::transpose(seqtriple<T> &B)//转置
/*//====================================================
{
	int *num=new int[n];int *k=new int[m];
	int i;
	n=B.m;m=B.n;t=B.t;
	num[20],k[20];
	if(t>0)                                //这个有点问题........
	{
  for(i=0;i<n;i++)num[i]=0;
  for(i=0;i<t;i++)num[trip[i].col]++;
  k[0]=0;
   for(i=1;i<n;i++)k[i]=k[i-1]+num[i-1];
    for(i=0;i<t;i++)
	{
		int j=k[trip[i].col]++;
		trip[i].col=B.trip[j].row;
		trip[i].row=B.trip[j].col;
		trip[i].value=B.trip[j].value;
	}
	}
	delete[]num;delete[]k;
}
*///==================================================
{
	int change;
	int x;
	x=B.m;B.m=B.n;B.n=x;B.t=t;
	for(int i=1;i<=B.t;i++)
	{
		change=B.trip[i].row;
		B.trip[i].row=B.trip[i].col;
		B.trip[i].col=change;
	}
}
template<class T>
void seqtriple<T>::add(seqtriple<T> &b,seqtriple<T> &c)
{
	int x,j;
	x=b.t;
	//b.t=b.t+c.t;
	if(b.m==c.m&&b.n==c.n)
	{
		for(int i=1;i<=x;i++)
		for( j=1;j<=c.t;j++)
		{
        if(b.trip[i].row ==c.trip[j].row)  //行数
			{if(b.trip[i].col==c.trip[j].col)//列数
			
			{
			b.trip[i].value=b.trip[i].value+c.trip[j].value;
		    if(b.trip[i].value==0)
				b.t=b.t-1;
			 if(b.t==1)
			 {cout<<"稀疏矩阵相加后为零矩阵"<<endl;}
			 else
			 for(int r=i;r<=b.t;r++){b.trip[r]=b.trip[r+1];}
		}
	    	else	
		    if(b.trip[i].col<c.trip[j].col)
			{ b.t=b.t+c.t;
				for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
                             
			 b.trip[i+1].value=c.trip[j].value;
			 b.trip[i+1].col=c.trip[j].col;
			 b.trip[i+1].row=c.trip[j].row;
			}
		    else
			{ b.t=b.t+c.t;
				for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
             b.trip[i+1].value=b.trip[i].value;
             b.trip[i+1].col=b.trip[i].col;
			 b.trip[i+1].row=b.trip[i].row;
			 b.trip[i].value=c.trip[j].value;
			 b.trip[i].col=c.trip[j].col;
			 b.trip[i].row=c.trip[j].row; 
			}
			}
	  if(b.trip[i].row>c.trip[j].row)
	  { b.t=b.t+c.t;
			 {  for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
             b.trip[i+1].value=b.trip[i].value;
             b.trip[i+1].col=b.trip[i].col;
			 b.trip[i+1].row=b.trip[i].row;
			 b.trip[i].value=c.trip[j].value;
			 b.trip[i].col=c.trip[j].col;
			 b.trip[i].row=c.trip[j].row; 
			}
	  }
	   if(b.trip[i].row<c.trip[j].row) //else  //=======================================有点问题
		 { b.t=b.t+c.t;
         // int p=0,n=0,m;
	  int m=0;
	      for(int k=0;i<x;k++)
	    /*  if(b.trip[k].row<c.trip[j].row)p++;
	       else
		    if(b.trip[k].row==c.trip[j].row)
		      if(b.trip[k].col<=c.trip[j].col)n++;
	  
       m=p+n;
       for(int r=b.t;m+1<r;r--){b.trip[r]=b.trip[r+1];}
	         b.trip[m+2].value=c.trip[j].value;
			 b.trip[m+2].col=c.trip[j].col;
			 b.trip[m+2].row=c.trip[j].row;*/
	   
		  {if(b.trip[k].row<c.trip[j].row)
			  {m=k;}
		 if(b.trip[k].row==c.trip[j].row)
				if(b.trip[k].col<c.trip[j].col){m=k;}
		 
		  }
		for(int r=x;m+1<r;r--){b.trip[r]=b.trip[r+1];}
	     b.trip[m+2].value=c.trip[j].value;
		 b.trip[m+2].col=c.trip[j].col;
		 b.trip[m+2].row=c.trip[j].row;
	  }
	  //=================================================
	}
	}
	else
	{ cout<<"不符合要求无法进行下面的操作"<<endl;}
		

}
template<class T>
void seqtriple<T>:: sub(seqtriple<T> &b,seqtriple<T> &c)
{
int x,j;
	x=b.t;

	if(b.m==c.m&&b.n==c.n)
	{
		for(int i=1;i<=x;i++)
		for( j=1;j<=c.t;j++)
		{
        if(b.trip[i].row ==c.trip[j].row)  //行数
			if(b.trip[i].col==c.trip[j].col)//列数
			{
				b.trip[i].value=b.trip[i].value-c.trip[j].value;
				if(b.trip[i].value==0)
				b.t=b.t-1;
			 if(b.t==1)
			 {cout<<"稀疏矩阵相加后为零矩阵"<<endl;}
			 else
			 for(int r=i;r<=b.t;r++){b.trip[r]=b.trip[r+1];}
			}
	    	else	
		    if(b.trip[i].col<c.trip[j].col)
			{ 	b.t=b.t+c.t;
				for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
                             
			 b.trip[i+1].value=-c.trip[j].value;
			 b.trip[i+1].col=c.trip[j].col;
			 b.trip[i+1].row=c.trip[j].row;
			}
		   else
			{ 	b.t=b.t+c.t;
			   for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
             b.trip[i+1].value=b.trip[i].value;
             b.trip[i+1].col=b.trip[i].col;
			 b.trip[i+1].row=b.trip[i].row;
			 b.trip[i].value=-c.trip[j].value;
			 b.trip[i].col=c.trip[j].col;
			 b.trip[i].row=c.trip[j].row; 
			} 
		   if(b.trip[i].row >c.trip[j].row)
	  { 	b.t=b.t+c.t;
			 {  for(int r=b.t;i<r;r--){b.trip[r]=b.trip[r+1];}
             b.trip[i+1].value=b.trip[i].value;
             b.trip[i+1].col=b.trip[i].col;
			 b.trip[i+1].row=b.trip[i].row;
			 b.trip[i].value=-c.trip[j].value;
			 b.trip[i].col=c.trip[j].col;
			 b.trip[i].row=c.trip[j].row; 
			}
	  }
	    if(b.trip[i].row<c.trip[j].row) //else  //=======================================有点问题
		 { b.t=b.t+c.t;
          int p=0,n=0,m;
	      for(int k=0;i<x;k++)
	      if(b.trip[k].row<c.trip[j].row)p++;
	       else
		    if(b.trip[k].row==c.trip[j].row)
		      if(b.trip[k].col<=c.trip[j].col)n++;
	  
       m=p+n;
       for(int r=b.t;m+1<r;r--){b.trip[r]=b.trip[r+1];}
	         b.trip[m+2].value=c.trip[j].value;
			 b.trip[m+2].col=c.trip[j].col;
			 b.trip[m+2].row=c.trip[j].row;
	  }
	  //=================================================
		}
	}
	else
		cout<<"不符合题目要求,无法进行下一步的操作"<<endl;

}
/*template<class T>
void seqtriple<T>:: mul(seqtriple<T> &b,seqtriple<T> &c)
{int y;
if(b.m==c.n)
{for(int i=1;i<=b.t;i++)
  for(int j=1;n<=c.t;j++)
  {if(b.trip[i].row=c.trip[j].col)
		 if(b.trip[i].col=c.trip[j].row)
	 {b.trip[i].value=c.trip[j].value*b.trip[i].value;
		 y++;
     b.trip[i].col=c.trip[j].col;
	 }
  }
 if(y)cout<<"相乘后的稀疏矩阵为0矩阵"<<endl;
 else
 {b.t=y;cout<<b;}
}
else
 cout<<"不符合题目要求,无法进行下一步的操作"<<endl;
} */
template<class T>
  void seqtriple<T>::mul(seqtriple<T>&B,seqtriple<T>&C)
{	
	  if(B.n!=C.m){cout<<"此两矩阵不符合相乘规则!"<<endl;}
	  else{;
	  T E[10][10];
	  T A[10][10];
	  T D[10][10];

	  for(int a=0;a<10;a++)
		  for(int b=0;b<10;b++)
		  { E[a][b]=0;A[a][b]=0;D[a][b]=0;}

	  for(int m=0;m<B.t;m++)
		  A[B.trip[m].row][B.trip[m].col]=B.trip[m].value;
	  for(int n=0;n<C.t;n++)
		  D[C.trip[n].row][C.trip[n].col]=C.trip[n].value;
	  
	  for(int i=0;i<10;i++)
		  for(int j=0;j<10;j++)
		  {
			  E[i][j]=0;
			  for(int k=0;k<10;k++)
				  E[i][j]+=A[i][k]*D[k][j];
		  }
    cout<<"稀疏矩阵相乘后结果为:"<<endl;
	for(int p=0;p<=B.m;p++)
	{   
       for(int r=0;r<=C.n;r++)
	   {
		   cout<<"   "<<E[p][r];
	   }  
	   cout<<endl;
	   }
	  }
}
template<class T>
istream &operator >>(istream &in,seqtriple<T>&x)
{
  x.input(in);	return in;
}
template<class T>
ostream &operator << (ostream &out, seqtriple<T>&x)
{
	 x.output(out);	return out;
}
const int size=20;
void main()
{ seqtriple<int> EN(size),H(size),A(size),B(size);
int x,y=1; 
 to:
cout<<"======================================="<<endl;
cout<<"1.稀疏矩阵的输入"<<endl;
cout<<"2.稀疏矩阵的输出(三元组表示)"<<endl;
cout<<"3.稀疏矩阵的转置"<<endl;
cout<<"4.两个稀疏矩阵的相加A+B"<<endl;
cout<<"5.两个稀疏矩阵的相加A-B"<<endl;
cout<<"6.两个稀疏矩阵的相乘A*B"<<endl;
cout<<"0.退出"<<endl;
cout<<"========================================"<<endl;
	cin>>x;
	if(y){
	switch(x)
	{
	case 1:cin>>EN;y=1;goto to;
		   
	case 2: cout<<EN<<endl;y=1;goto to;
	case 3:	cout<<"转置前:"<<endl;cout<<EN;EN.transpose(EN);cout<<"转置后:"<<endl;cout<<EN;y=1;goto to;
	case 4:	cout<<"请输入稀疏矩阵A,B"<<endl;cin>>A;cin>>B;A.add(A,B);cout<<"相加结果为:"<<endl;cout<<A<<endl;y=1;goto to;
	case 5: cout<<"请输入稀疏矩阵A,B"<<endl;cin>>A;cin>>B;A.sub(A,B);cout<<"相减结果为:"<<endl;cout<<A<<endl;y=1;goto to;
	case 6:  cout<<"请输入稀疏矩阵A,B"<<endl;cin>>A;cin>>B;A.mul(A,B);cout<<"相乘结果为:"<<endl;cout<<A<<endl;y=1;goto to;
	case 0: cout<<"欢迎使用,退出"<<endl;y=0;break;
	}
	}
}





⌨️ 快捷键说明

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