我正在尝试为正交链接稀疏矩阵编写代码。
这是一个问题:
稀疏矩阵的替代链接表示使用具有down,right,row,col和value字段的节点。表示稀疏矩阵的每个非零条目
由一个节点。零术语未明确存储。节点链接在一起形成两个循环列表。第一个列表(行列表)是通过按行链接节点并使用右侧字段按行链接组成的。第二个列表列列表由通过向下字段链接节点组成。在此列表中,节点按列链接,按列链接。这两个列表共享一个公共标头节点。此外,节点被添加到矩阵的维度。
输入文件如下所示:
// Matrix A
4 4 7
1 1 2
1 4 1
2 2 7
3 1 9
3 3 8
4 2 4
4 3 5
// Matrix B
4 4 5
1 3 4
2 1 6
2 3 3
3 2 5
4 4 9
这是我的运营商代码>>:
istream& operator>>(istream& in, OrthogonalLinkedSparseMatrix& x){
in >> x.numRows >> x.numCols >> x.numTerms;
in >> x.currentNode->row >> x.currentNode->col >> x.currentNode->value;
x.push_back(x.currentNode);
if((x.currentNode->row == 1)&&(x.currentNode->col == 1)){
x.hnode->right = x.currentNode;
x.hnode->down = x.currentNode;
}
if(x.currentNode->col == 1){
x.hnode->down = x.currentNode;
}
if(x.currentNode->row == 1){
x.hnode->right = x.currentNode;
}
for (int i = 2; i <= x.numTerms; i++) {
in >> x.currentNode->row >> x.currentNode->col >> x.currentNode->value;
x.push_back(x.currentNode);
}
return in;
}
编译好。但是当我尝试运行它时,我不断收到分段错误 谁能帮忙? 谢谢你!
这是OrthogonalLinkedSparseMatrix.h:
#ifndef O_L_SPARSE_MATRIX_H
#define O_L_SPARSE_MATRIX_H
#include <iostream>
#include <fstream>
#include "node.h"
#include "myExceptions.h"
using namespace std;
class OrthogonalLinkedSparseMatrix;
ostream& operator<< (ostream&, OrthogonalLinkedSparseMatrix&);
istream& operator>> (istream&, OrthogonalLinkedSparseMatrix&);
class OrthogonalLinkedSparseMatrix{
public:
friend ostream& operator<<(ostream& out, OrthogonalLinkedSparseMatrix& x);
friend istream& operator>>(istream& in, OrthogonalLinkedSparseMatrix& x);
OrthogonalLinkedSparseMatrix(){}
~OrthogonalLinkedSparseMatrix(){}
void transpose(OrthogonalLinkedSparseMatrix &b);
void add(OrthogonalLinkedSparseMatrix &a, OrthogonalLinkedSparseMatrix &c);
void push_back(matrixNode *&mat_Node);
void setDowns(matrixNode *&mat_Node);
private:
matrixNode *hnode;
int numRows, numCols, numTerms;
matrixNode *currentNode;
matrixNode *previousNode;
matrixNode *nextNode;
};
// code for operator >> & <<, etc goes here, but everything's commented out except operator >>
#endif
编辑:我包括运营商&lt;&lt;以及:
ostream& operator<<(ostream& out, OrthogonalLinkedSparseMatrix& x){
if(x.numTerms == 0){
out << "No non-zero terms" << endl;
return out;
}
out << x.numRows << x.numCols << x.numTerms << endl;
for (int i = 0; i < x.numTerms; i++) {
out << x.currentNode->row << x.currentNode->col << x.currentNode->value << endl;
}
return out;
}
答案 0 :(得分:2)
我认为您的问题在于currentNode
。您不应该将它作为类变量来使用,而是每次从流中读取输入时都应该创建一个新变量。例如,
istream& operator>>(istream& in, OrthogonalLinkedSparseMatrix& x)
{
in >> x.numRows >> x.numCols >> x.numTerms;
int inRow, inCol, inValue;
in >> inRow >> inCol >> inValue; // Get the values from input
// note: this allocates a NEW matrixNode on the heap, and pushes a pointer into the matrix.
x.push_back(new matrixNode(inRow, inCol, inValue));
if(x.currentNode->col == 1){
x.hnode->down = x.currentNode;
}
if(x.currentNode->row == 1){
x.hnode->right = x.currentNode;
}
for (int i = 2; i <= x.numTerms; i++)
{
in >> inRow >> inCol >> inValue; // Get the values from input
// note: this allocates a NEW matrixNode on the heap, and pushes a pointer into the matrix.
x.push_back(new matrixNode(inRow, inCol, inValue));
}
return in;
}
这里需要注意的一些事项:
push_back()
时,都会推送一个新的matrixNode。在您的实现中,始终添加了相同的节点,并且可能从未初始化。通常,自己管理指针非常危险并且容易出现内存泄漏。在这种情况下,当您不再需要时,在每个指针上调用delete
非常重要。很可能你会想要在你的析构函数中做到这一点。
编辑:
看起来hnode
可能与无效指针一起使用。确保在使用之前指定/创建此matrixNode指针。