数据结构_数组与广义表_矩阵的十字链表存储稀疏矩阵相加

    十字链表做存储结构实现矩阵相加,这个功能简单的程序调试了N久,数度想放弃,但想想还是想坚持了下来,指针跳来跳去的快把我跳晕了,各种细节,比如删除节点后要修改相应节点的指针以确保能正常输出。终于调通了,一道坎总算过去了,示例通过后连加注释的勇气都没了。算了,先贴出来吧。


"crosslist.h"



#include<iostream>
using namespace std;

#define ElemType int
#define MAX_MATRIX_SIZE 20

class OLNode
{
public:
	OLNode();
	int i,j;
	ElemType e;
	OLNode* down,*right;
};

OLNode::OLNode()
{
	down=right=NULL;
}

class CrossList
{
public:
	CrossList();
	OLNode *lhead[MAX_MATRIX_SIZE+1];
	OLNode *uhead[MAX_MATRIX_SIZE+1];
	int mu,nu,tu;
};

CrossList::CrossList()
{
	for(int i=0;i<MAX_MATRIX_SIZE;i++)
		lhead[i]=uhead[i]=NULL;
	mu=nu=tu=0;
}

class Matrix
{
public:
	void MatrixPlus();//接口函数
private:
	void GetMatrix(CrossList &);//得到三元组矩阵并将其链接成十字链表
	void PrintMatrix(CrossList &);//打印三元组矩阵
	void Plus(CrossList &,CrossList &);//在十字链表上实现矩阵相加
};

void Matrix::MatrixPlus()//接口函数
{
	CrossList m,n;
	GetMatrix(m);//得到三元组矩阵并将其链接成十字链表
	GetMatrix(n);//得到三元组矩阵并将其链接成十字链表
	PrintMatrix(m);//打印三元组矩阵
	PrintMatrix(n);//打印三元组矩阵
	Plus(m,n);//在十字链表上实现矩阵相加
	PrintMatrix(m);//打印三元组矩阵
}

void Matrix::GetMatrix(CrossList &t)//得到三元组矩阵并将其链接成十字链表
{
	cout<<"Please Input The Size Of The Matrix(m*n)"<<endl;
	cin>>t.mu>>t.nu;
	cout<<"Please Input Matrix With Increasing Order Of RowNumber"<<endl
		<<"rownum columnnum element"<<endl<<endl;
	int i,j;
	ElemType e;
	OLNode *newnode,*p,*keep;
	while(cin>>i>>j>>e)
	{
		if(e!=0)//元素不为0
		{
			newnode=new OLNode;
			newnode->i=i;
			newnode->j=j;
			newnode->e=e;
			if((p=t.lhead[i])==NULL)//左连
				t.lhead[i]=newnode;
			else
			{
				while(p->right!=NULL&&p->right->right->j<j)
					p=p->right;
				if(p->right==NULL)
					p->right=newnode;
				else
				{
					keep=p->right->right;
					p->right=newnode;
					newnode->right=keep;
				}
			}
			if((p=t.uhead[j])==NULL)//上连
				t.uhead[j]=newnode;
			else
			{
				while(p->down!=NULL&&p->down->down->j<j)
					p=p->down;
				if(p->down==NULL)
					p->down=newnode;
				else
				{
					keep=p->down->down;
					p->down=newnode;
					newnode->down=keep;
				}
			}
			t.tu++;
		}
	}
	cin.clear();
}

void Matrix::Plus(CrossList &m,CrossList &n)//在十字链表上实现矩阵相加
{
	OLNode *pm,*pn,*pre,*insert,*keep,*hl[MAX_MATRIX_SIZE];
	for(int i=1;i<=m.mu;i++)//遍历从所有行
	{
		pm=m.lhead[i];
		pn=n.lhead[i];
		pre=NULL;
		for(int j=0;j<MAX_MATRIX_SIZE;j++)
			hl[j]=m.uhead[j];
		while(pn!=NULL)
		{
			//横插
			if(pm==NULL||pm->j>pn->j)
			{
				//new a copynode
				insert=new OLNode;
				insert->i=pn->i;
				insert->j=pn->j;
				insert->e=pn->e;
				//insert
				if(pre==NULL)
					m.lhead[i]=insert;
				else
					pre->right=insert;
				insert->right=pm;
				pre=insert;
				//竖插
				if(m.uhead[insert->j]==NULL||m.uhead[insert->j]->i>insert->i)
				{
					insert->down=m.uhead[insert->j];
					m.uhead[insert->j]=insert;
				}
				else
				{
					insert->down=hl[insert->j]->down;
					hl[insert->j]->down=insert;
				}
				hl[insert->j]=insert;
				pn=pn->right;
			}
			else if(pm->j==pn->j)
			{
				pm->e+=pn->e;
				if(pm->e==0)
				{
					keep=pm;
					if(pre==NULL)
					{
						m.lhead[pm->i]=pm->right;
					}
					else
					{
						pre->right=pm->right;
						pre=pm;
					}
					pm=pm->right;
					delete keep;
					
				}
				pn=pn->right;
			}
			else
			{
				pre=pm;
				pm=pm->right;
			}
		}
	}
}

void Matrix::PrintMatrix(CrossList &t)//打印三元组矩阵
{
	OLNode *p;
	for(int i=1;i<=t.mu;i++)
	{
		p=t.lhead[i];
		while(p!=NULL)
		{
			cout<<p->i<<" "<<p->j<<" "<<p->e<<endl;
			p=p->right;
		}
	}
	cout<<endl;
}




"main.cpp"


#include"crosslist.h"

int main()
{
	Matrix M;
	M.MatrixPlus();
	system("pause");
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值