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

📄 zhanzhi.cpp

📁 矩阵的加法与转置
💻 CPP
字号:
#include<iostream.h>
#include<stdlib.h>
const int Maxrows=100;
typedef int elemtype;
struct Triplenode
{	int row,col; //存储行号和列号
	elemtype val; //存储元素值
	Triplenode *next; //指向同一行的下一个结点
};
struct LMatrix
{	int m,n,t; //保存稀疏矩阵的行数,列数和非零元素的个数
	Triplenode *vector[Maxrows+1];//行指针
};

void initLMatrix(LMatrix &M)   //初始化
{	M.m=0;M.n=0;M.t=0;
	for(int i=1;i<=Maxrows;i++)
		M.vector[i]=NULL;
}


//矩阵的输入
void inputLMatrix(LMatrix &M,int m,int n)   
{
	M.m=m;M.n=n;
	int row,col,val;
	int k=0;
    Triplenode *p=NULL,*q=NULL; 
	cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
	cin>>row>>col>>val;
	while(row<0||row>m||col<0||col>n)//判断输入繁的元素一定在矩阵中
	{
		cout<<"不是此矩阵的元素!请检查非零元素所在的行号,列号,并重新输入。"<<endl;
        cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
		cin>>row>>col>>val;
	}
	while(row!=0)
		{
		k++;
		p=new Triplenode;  //建立新结点
		p->row=row;
		p->col=col;
		p->val=val;
		p->next=NULL;
		q=M.vector[row];  //使q指向第row行
		if(q==NULL)         //将结点链接到所在行单链表的末尾
			M.vector[row]=p;
		else
			{
			while(q->next!=NULL)
				q=q->next;
			q->next=p;	
			}
        cout<<"依次输入非零元素的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
		cin>>row>>col>>val; //输入一个新三元组
        	while(row<0||row>m||col<0||col>n)
			{
				cout<<"不是此矩阵的元素!请检查非零元素所在的行号,列号,并重新输入。"<<endl;
                cout<<"依次输入非零元素的行所在的行号-列号-元素值,(0,0,0)为结束标志"<<endl;
		        cin>>row>>col>>val;
			}
		}
	M.t=k;
}

void outputLMatrix(LMatrix M)  //矩阵的输出
{	
	Triplenode *p;
	int i,j;
	for(i=1;i<=M.m;i++)
		{
		for(j=1;j<=M.n;j++)
			{
			p=M.vector[i];
			 while(p!=NULL&&p->col!=j) //找第j行的非零元素
					p=p->next;
			 if(p==NULL)
					cout<<"0"<<"  ";
			 else
				 cout<<p->val<<"  ";
			}
		 cout<<endl;
		}
}


//加法运算
//不必检查矩阵的行列是否相同,因为输入时已经输入了相同大小的矩阵
LMatrix Add(LMatrix M1,LMatrix M2)    
{	
	if(M1.t==0)     //矩阵1为空,返回M2
		return M2;
    if(M2.t==0)     //矩阵2为空,返回M1
		return M1;
	int k=0;  //记录相加后结果矩阵M1中结点的个数
	for(int i=1;i<=M1.m;i++)
	{
		Triplenode *p1,*p2,*p; //P指向P1的前驱结点
		p=p1=M1.vector[i];   //P,P1指向M1矩阵的第i行单链表的待加的结点
		p2=M2.vector[i];//P2指向M2矩阵的第i行单链表的待加的结点
        M1.vector[i]=NULL;
		while(p1!=NULL&&p2!=NULL)
		{
			Triplenode *newptr=new Triplenode;
			if(p1->col<p2->col)
			{
				*newptr=*p1;       //将P1下移
			    p1=p1->next;
			}
			else if(p1->col>p2->col)
			{ 
				*newptr=*p2;       //将P2下移
			    p2=p2->next;
			}
			else if(p1->val+p2->val==0) //两结点值相加为0
			{
				p1=p1->next;
				p2=p2->next;
				continue;			
			}			
			else 				
			{	
				*newptr=*p1;
				newptr->val+=p2->val;  //将P2所指结点的值加到P1所指结点的值上						
				p1=p1->next;		
				p2=p2->next;			
			}
			newptr->next=NULL;
			if(M1.vector[i]==NULL)
				M1.vector[i]=newptr;
			else
				p->next=newptr;
			p=newptr;
			k++;
		}
		while(p1!=NULL&&p2==NULL)  //P1不为空P2为空,将P1复制到新结点并插入到M1中	
		{
			Triplenode *newptr=new Triplenode;
			*newptr=*p1;
			newptr->next=NULL;
			if(M1.vector[i]==NULL)
				M1.vector[i]=newptr;
			else
				p->next=newptr;
			p=newptr;
			p1=p1->next;
			k++;		
		}
		while(p1==NULL&&p2!=NULL)    //P1为空P2不为空,将P2复制到新结点并插入到M1中
		{
			Triplenode *newptr=new Triplenode;
			*newptr=*p2;
			newptr->next=NULL;
			if(M1.vector[i]==NULL)
				M1.vector[i]=newptr;
			else
				p->next=newptr;
			p=newptr;
			p2=p2->next;
			k++;		
		}
	}
	M1.t=k;
	return M1;
}

//矩阵的转置
LMatrix Tranpose(LMatrix M) 
{  
	int i,m,j;
    Triplenode *p,*q,*h;
	LMatrix M1;//用M1存放转置的矩阵
    initLMatrix(M1);//初始化M1
	M1.m=M.n;
	M1.n=M.m;
	M1.t=M.t;
	for(i=1;i<=M.m;i++)
	{
		p=M.vector[i];
		if(p==NULL)//如果M矩阵的列为空	
			continue;
		m=0;//控制while循环
		while(p!=NULL||m==0)
		{
			m=p->col;
		    p->col=p->row;
		    p->row=m;
			p->next=NULL;
			j=p->row;
			q=M1.vector[j];
			if(q==NULL)
				M1.vector[j]=p;
			else
			{
				if((p->col)<(q->col))
				{
					p->next=M1.vector[j];
					M1.vector[j]->next=p;
				}
				else
				{
					while((p->col)>(q->col))
					{
						h=q;
						q=q->next;
					}
					p->next=h->next;
					h->next=p;
				}

			}
			p=p->next;
		}

	}
	return M1;
}



void main()
{	
	LMatrix M1,M2,M;
	int m,n;
	initLMatrix(M1);  //初始化矩阵1
	initLMatrix(M2);  //初始化矩阵2
	cout<<"输入待加矩阵的大小,即几行,几列。"<<endl;
	cout<<"请输入行:m=";
	cin>>m;
	cout<<"请输入列:n=";
	cin>>n;
	cout<<"请输入矩阵1的信息"<<endl;
	inputLMatrix(M1,m,n); //输入矩阵M1
    cout<<"请输入矩阵2的信息"<<endl;
	inputLMatrix(M2,m,n);//输入矩阵M2
	cout<<"矩阵1为:"<<endl;
	outputLMatrix(M1);
    cout<<endl;
	cout<<"矩阵2为:"<<endl;
	outputLMatrix(M2);
	cout<<endl;
	M=Add(M1,M2);  //将M1,M2进行相加
    cout<<"两矩阵之和为:"<<endl;
 	outputLMatrix(M);//输出两矩阵之和
    M1=Tranpose(M1); //对矩阵M1的转置
	cout<<"M1的转置矩阵为:"<<endl;
    outputLMatrix(M1);
}

⌨️ 快捷键说明

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