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

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

    十字链表做存储结构实现矩阵相加,这个功能简单的程序调试了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");
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注