快速业务通道

数据结构学习(C++)之稀疏矩阵

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
data.downrow;
}
}
Matrix & Add(Matrix &matB)
{
//初始化赋值辅助变量
if (row != matB.row || col != matB.col || matB.num == 0) return *this;
Node<MatNode> *pA, *pB;
Node<MatNode> **pAT = new Node<MatNode>*[col + 1];
Node<MatNode> **pBT = new Node<MatNode>*[matB.col + 1];
List<MatNode> *qA = pGetFirst()->data.downrow, *qB = matB.pGetFirst()->data.downrow;
First(); matB.First();
for (int j = 1; j <= col; j++)
{
pAT[j] = pNext();
pBT[j] = matB.pNext();
}
//开始
for (int i = 1; i <= row; i++)
{
qA->First(); qB->First();
pA = qA->pNext(); pB = qB->pNext();
while (pA != NULL && pB !=NULL)
{
if (pA->data.col == pB->data.col)
{
pA->data.data += pB->data.data;
pBT[pB->data.col]->data.down = pB->data.down; qB->Remove();
if (!pA->data.data)
{
pAT[pA->data.col]->data.down = pA->data.down;
qA->Remove();
}
else
{
pAT[pA->data.col] = pA;
qA->pNext();
}
}
else
{
if (pA->data.col > pB->data.col)
{
pBT[pB->data.col]->data.down = pB->data.down;
qB->pRemove();
pB->data.down = pAT[pB->data.col]->data.down;
pAT[pB->data.col]->data.down = pB;
pAT[pB->data.col] = pB;
qA->InsertBefore(pB);
}
else if (pA->data.col < pB->data.col)
{
pAT[pA->data.col] = pA;
qA->pNext();
}
}
pA = qA->pGet();pB = qB->pGet();
}
if (pA == NULL && pB != NULL)
{
qA->pGetPrior()->link = pB;
qB->pGetPrior()->link = NULL;
while (pB != NULL)
{
pBT[pB->data.col]->data.down = pB->data.down;
pB->data.down = pAT[pB->data.col]->data.down;
pAT[pB->data.col]->data.down = pB;
pAT[pB->data.col] = pB;
pB = pB->link;
}
}
if (pA !=NULL)
{
while (qA->pGet() != NULL)
{
pAT[pA->data.col] = pA;
qA->pNext();
}
}
qA = qA->first->data.downrow; qB = qB->first->data.downrow;
}
delete []pAT; delete []pBT;
return *this;
}
private:
int row, col, num;
};
#endif

【说明】对于十字链表来说,只要记住对每个节点的操作,要同时考虑它的两个指针域,那么,各种算法的理解都不是很难。比如说矩阵加法,“两个矩阵相加和两个一元多项式相加极为相似,所不同的是一元多项式只有一个变元(指数项),而矩阵中每个非零元有两个变元(行值和列值),每个节点既在行表中又在列表中,致使插入和删除节点时指针的修改稍为复杂,故需要更多的辅助指针。”(《数据结构(C语言版)》)其实private的row等可以放在首行的头节点里的,但为了清晰一点(本来就够乱了),我把他们单立出来了。另外,很多地方考虑不是很周全,要是不按照注明的要求使用,很容易就会出错。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号