通过链表表示矩阵

时间:2011-02-16 05:59:41

标签: c++ list matrix

问题是:

  

稀疏矩阵的替代链接表示使用具有向下右侧的字段的节点,       roe,col和value。表示稀疏矩阵的每个非零项       由一个节点。零术语未明确存储。节点是链接的       一起形成两个圆形清单。制作第一个列表,即行列表       通过按行链接节点,使用右侧按行链接       场。第二个列表列列表是通过链接节点组成的       下场。在此列表中,节点按列和列内链接       按行。这两个列表共享一个公共标头节点。另外,一个       节点被添加到矩阵的维度。

我希望重载运算符>>并添加和转置方法:

 istream & operator>>(istream & in, sparseMatrixLinked<T> x); 
//The input format is as follows. 

4   4   3  //   # of rows, # of cols, # of nonzero entries
0   0   2  // row #, col #, item value #
0   3   1
1   1   7

void sparseMatrixLinked<T>::add(sparseMatrixLinked<T> &b,sparseMatrixLinked<T> &c);
        // c = (*this) + b 


void sparseMatrixLinked<T>::transpose(sparseMatrixLinked<T> &b) ;
// b is transpose of *this.

我无法找到解决方案。有人可以提供一些建议吗?非常感谢你!

1 个答案:

答案 0 :(得分:2)

对于transpose,您可以遍历一个列表,交换所有链接和行/列指针。在伪代码中:

set node to header
do {
    swap node.row and node.col
    swap node.right and node.down
    node = node.right
} while node != header;

这里是addNode,一个(低效)解决方案是通过遍历两个列表来添加单个节点,直到找到节点的插入点,然后将其添加到那里。它可以在第二个矩阵中的每个节点上使用,以实现类似+=的内容;添加当前矩阵的副本首先给出add

newnode = allocate node with row, col, val set, pointers null
top = header
while (top.down != header and 
       (top.down.col < newnode.col or
        (top.down.col == newnode.col and
         top.down.row < newnode.row)
       )
    top = header.down
left = header
while (left.right != header and 
       (left.right.row < newnode.row or 
        (left.right.row == newnode.row and 
         left.right.col < newnode.col)
       )
      )
    left = left.right
if top == left
    // if I'm thinking correctly this means newnode is already there
    assert top.row == newnode.row and top.col == newnode.col
    top.val += newnode.val
    delete newnode
else
    newnode.right = left.right
    newnode.down = top.down
    left.right = newnode
    top.down = newnode

有更有效的方式来实现add,但这些方法留给了读者。

operator>>应该或多或少看起来像这样:

istream & operator>>(istream & in, sparseMatrixLinked<T> x)
{
   x.clear();

   int rows, cols, vals;
   in >> rows >> cols >> vals;
   for (int i = 0; i > vals; i++) {
       int row, col, val;
       in >> row >> col >> val;
       x.addNode(row, col, val);
   }

}

您可以使用上述算法来实现addNode。不过,这个问题非常缓慢。这里有一个提示:如果输入以任何方式排序,您可以利用它来更快地构建矩阵。即使不是这样,更有效的方法来执行任意节点插入也会使事情变得更好。