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

📄 cpp1.cpp

📁 矩阵的加法与转置
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
const int maxrows=10;
typedef int elemtype;
struct triplenode{
   int row,col;//存储行号和列号
   elemtype val;//存储元素值
   triplenode *next;//指向同一行的下一个结点
};

struct lmatrix{
   int m,n,t;//行数,列数和非零元素的个数
   triplenode *vector[maxrows+1];//定义一个行指针
};

//矩阵的初始化
void initmatrix(lmatrix &M)
{
 M.m=0;M.n=0;M.t=0;
 for(int i=0;i<=maxrows;i++)
	 M.vector[i]=NULL;
}



void inputmatrix(lmatrix &M,int m, int n)//三元组的输入
{
  M.m=m;M.n=n;
  int row,col,val;
  int k=0;
  cout<<"请输入1个元组(当输入的三元组为0 0 0 时表示结束!):"<<endl;
  cin>>row>>col>>val;
  while(row!=0)
  {
             k++;
			 triplenode *p,*q;
			  if(row>m||col>n)
			  {
				  cout<<"你输入的三元组不正确,请重新输入!"<<endl;
				  cin>>row>>col>>val;
				  continue;
				  
			  }
			 p=new triplenode;
			 p->row=row;
			 p->col=col;
			 p->val=val;
			 p->next=NULL;
			 q=M.vector[row];
			 if(q==NULL)
				 M.vector[row]=p;
			 else
			 {
			  while(q->next!=NULL)
				  q=q->next;
			  q->next=p;
			 }
			 cout<<"请输入"<<k+1<<"个元组"<<endl;
              cin>>row>>col>>val;
			 
  }
  M.t=k;
}


void outputmatrix(lmatrix &M)//矩阵的输出
{
	int i,j;
	triplenode *p;
	for(i=1;i<=M.m;i++)
	{for(j=1;j<=M.n;j++)
	{p=M.vector[i];
	while(p!=NULL&&p->col!=j)
		p=p->next;
	   if(p==NULL)
		  cout<<"0"<<" ";
	  else
		  cout<<p->val<<" ";
	}
	cout<<endl;
	}     
}
lmatrix add(lmatrix &M1,lmatrix &M2)
{
  
  if(M1.m!=M2.m||M1.n!=M2.n)
  {
	  cerr<<"两矩阵的行数和列数不同不能相加!"<<endl;
   exit(0);
  }
 
  if((M1.t==0)&&(M2.t==0)) 
  return M1;
  int k=0;
  for(int i=1;i<=M1.m;i++)
  {
    triplenode *p1,*p2,*p;
	p1=M1.vector[i];
	p2=M2.vector[i];
	p=p1;/*P是M矩阵的第I行的尾结点的指针*/
	while(p1!=NULL&&p2!=NULL)
	{
	  triplenode  *newptr=new triplenode;
	  if(p1->col<p2->col)
	  {
	   *newptr=*p2;
	   p1->next=newptr;
	   k++;
	   p1=newptr->next;
	   p2=p2->next;
	   }
	  else if(p1->col>p2->col)
	  {
	    *newptr=*p2;
          newptr->next=p1->next;  //将新结点插入到M1中
			p1->next=newptr;
			p=p1;
			p1=p1->next;k++;
			p2=p2->next;
	  }
	  else if(p1->val+p2->val==0)
	  {
	    p1=p1->next;
		p2=p2->next;
		continue;
	  }
	  else
	  {
	    p1->val+=p2->val;
        *newptr=*p1;
	    p1=p1->next;
	    p2=p2->next;
	  }
	  newptr->next=NULL;
	  if(p==NULL)
		  M1.vector[i]=newptr;
	  else
		  p->next=newptr;
	  p=newptr;
	  k++;
	}
	while((p2!=NULL)&&(p1==NULL))
	{
	  *p1=*p2;
	 p1=p1->next;
	 p2=p2->next;
	}	
  }
	M1.t=k;
	return M1;
}



void main()
{
  lmatrix  h1,h2,h;
  int a,b;
  cout<<"请输入矩阵的行数和列数:"<<endl;
  cin>>a>>b;
  initmatrix(h1);//初始化
  inputmatrix(h1,a,b);//输入三元组
  cout<<"第一个矩阵为:"<<endl;
  outputmatrix(h1);//输出矩
  cout<<"请输入同上矩阵同样的行数和列数:";
  cin>>a>>b;
  initmatrix(h2);
  inputmatrix(h2,a,b);
  cout<<"第二个矩阵为:"<<endl;
  outputmatrix(h2);
  cout<<"相加后的矩阵为:";
  h=add(h1,h2) ;
  cout<<endl;

  outputmatrix(h);                                              
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
                         

⌨️ 快捷键说明

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