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

📄 稀疏距阵的数组实现.cpp

📁 数据结构的稀疏距阵的实现
💻 CPP
字号:
#include<iostream.h>

const int maxsize=10;


struct syz
{
	int i,j;
	float a;
};



class jz
{

private:

       syz L[maxsize];
	   int mu,nu,tu;

public:
	   
	   jz()
	   {
			for(int m=0;m<maxsize;m++)
			{L[m].a=0.0;}
			mu=nu=tu=0;
	   
	   };

	  
	   
	   
	   void creat(int a,int b)
	   {
			mu=a;nu=b;tu=0;
			
            cout<<"请按行依次输入非零元素!!!!!!否则可能出错!!!!!"<<endl;

			cout<<"输入(0,0,0)结束!"<<endl;

			for(tu;;tu++)
			{
				cout<<"它的行标为:";
				cin>>L[tu].i;
				/*for(k=0;k<tu;k++)
				{
					if(L[k].i>L[tu].i && L[tu].i!=0)
					{
						cout<<endl;cout<<"您输入的数据有误,请重新输入:)"<<endl;
					    cout<<"它的行标为:";
					    cin>>L[tu].i;
						k=0;
					}
				}//纠错未实现
				*/
				
                
				cout<<"它的列标为:";
				cin>>L[tu].j;
	
				cout<<"它的数值为:";
				cin>>L[tu].a;
				cout<<endl;

				if(!L[tu].i&&!L[tu].j&&!L[tu].a)break;
				if(tu>=maxsize)cout<<"请申请更大空间存储!"<<endl;
			}
	   };//建立矩阵

	   void Trans(jz &y)
	   {
		  
		   y.mu=nu; y.nu=mu; y.tu=tu;
		   
		   if(y.tu)
		   {
				int q=0;
				for(int col=0;col<nu;++col)
					for(int p=0;p<tu;++p)
					if(L[p].j==col)
					{
						y.L[q].i=L[p].j;
						y.L[q].j=L[p].i;
						y.L[q].a=L[p].a;
						++q;
					}//要进行三远组的按行排序
					
		    
		   }
          
		   
		   
		   
//****************************************************************************		   
		   
		   /*
		   
			   for(int col=1;col<=nu;col++)
			   num[col]=0;
			   for(int t=1;t<=tu;t++)num[L[t].j]++;
			   cpot[1]=1;
			   for(col=2;col<=nu;col++)cpot[col]=cpot[col-1]+num[col-1];
			   for(int p=1;p<=tu;p++)
			   {
					col=L[p].j;
					q=cpot[col];
					y.L[q].i=L[p].j;
					y.L[q].j=L[p].i;
					y.L[q].a=L[p].a;
					cpot[col]++;
			   
			   
			   }
		   };
		   */
//***************************上述代码是快速转置一样调试成功!********************   
 	  			 
	   };//转置

	   //**************************加法注释:***********************************
	   /*
	      1两矩阵相加的前提:两矩阵的行数和列数分别对应相等; 

          2两矩阵相加的结果:行、列数不变; 

          3具有相同行号和列号的元素相加,如果相加结果为0,则不在结果矩阵中建立结点;

          4三元组都是按行排列的!
	    */
	   //***********************************************************************


       void Add(jz b,jz &c)
	   {
		   if(mu!=b.mu&&nu!=b.nu)
			   cout<<"抱歉不能实现加法,原因可能是两个矩阵不是相同行数和列数"<<endl;
		 
		   c.tu=tu+b.tu;
		   c.mu=mu;
		   c.nu=nu;
		   syz *p,*p1,*p2;
		   p=c.L;
		   p1=L;
		   p2=b.L;
		   
		   
		   while(p1<L+tu && p2<b.L+b.tu)
		   {   
			   

			   if(p1->i<p2->i || (p1->i==p2->i && p1->j<p2->j) )*p++=*p1++;
			   else if(p1->i>p2->i ||(p1->i==p2->i && p1->j>p2->j))*p++=*p2++;
			   else if(p1->i==p2->i && p1->j==p2->j)
			   {p->i=p1->i;p->j=p1->j;p->a=p1->a+p2->a;p++;p1++;p2++;c.tu--;}
		   }
		   
		   while(p1<L+tu)*p++=*p1++;
		   while(p2<b.L+b.tu)*p++=*p2++;
		   

	   };//加法
	   
	   
  

	   void print()
	   {
			/*
		    int p=0;
		    if(tu==0)cout<<"此矩阵为空矩阵!!"<<endl;
            else
				
				for(int x=1;x<=mu;x++)
				{    
					
					    int y=1;
						
						
				        //for(int p=0;p<tu;p++)
							if(L[p].i-x>=1&&!p)
							{  
									 
								     for(y=1;y<=nu;y++)
										{	
											cout<<"0"<<",";
										}
									 cout<<endl;
									 continue;
									 
							}//处理前面为0的矩阵
							y=1;
						    while(x==L[p].i)
							{
								if(y<L[p].j)
									{cout<<"0"<<",";y++;}
								if(y==L[p].j)
									{cout<<L[p].a<<",";y++;p++;}
								if(L[p].i!=x)
									{
										for(y;y<=nu;y++)
											cout<<"0"<<",";
										    cout<<endl;
										    
									}
                                
							}
							if(L[p].i-x>1)
							{   
									 
								     for(y=1;y<=nu;y++)
										{	
											cout<<"0"<<",";
										}
									 cout<<endl;
									 
									 
							}
							
							  
							  
							
							if(p==tu){p++;continue;}
							while(p>tu)
							{ 
								
								for(int i=0;i<nu;i++) 
								cout<<"0"<<",";
								cout<<endl;
								break;
                                                                    
  
							}//处理结尾都为0的矩阵
							
						
							
				}
				*/
				//经验!!!!!如果问题有很多方面,先不要把问题分细,先试试能不能有循环!!!!
				//如果不是那样太麻烦了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

				
				
				
			
			
			for(int x=1;x<=mu;x++)//行先循环
			  {
				  for(int y=1;y<=nu;y++)
				  {
					  for(int p=0;p<tu;)
					  {if(L[p].i==x && L[p].j==y){cout<<L[p].a<<",";break;}
					   else p++;}
                      if(p==tu)cout<<"0"<<",";
				  }
				  cout<<endl;
			  }
			  
			  

	   };//输出
};



void main()
{
	jz a,b,c,d;
	int mu,nu;
    cout<<"请输入a矩阵的行数:";
	cin>>mu;
    cout<<"请输入a矩阵的列数:";
	cin>>nu;
	a.creat(mu,nu);
	a.print();

	
	a.Trans(d);
	cout<<"............................"<<endl;
	d.print();
	cout<<":)转置成功!"<<endl;


	cout<<"请输入b矩阵的行数:";
	cin>>mu;
    cout<<"请输入b矩阵的列数:";
	cin>>nu;
	b.creat(mu,nu);
	b.print();
	cout<<"............................"<<endl;
	
    
	a.Add(b,c);//加法
	c.print();
	cout<<"加法成功!!"<<endl;




}

⌨️ 快捷键说明

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