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