我必须使用3个动态数组(索引从0开始)在C ++中实现CSR矩阵数据结构,但我遇到了麻烦。所以我必须实现2个功能:
1)modify(int i, int j, TElem e)
-将(i,j)的值修改为e或添加if(如果不存在)或删除,如果e为null。
2)element(int i, int j) const
-返回在(i,j)上找到的值
我想用下面的方式测试我的代码:
矩阵m(4,4); m.print();它将打印:
行:0 0 0 0 0
列:
值:
(这很好)
现在,如果我要修改:m.modify(1,1,5); //元素(1,1)将设置为5
m.print()的输出;将是:
行:0 1 1 1 1
列:1
值:5(也可以)
现在,如果我要打印m.element(1,1),它将返回0,而m.element(0,1)将返回5。
这是我对element(int i,int j)的实现:
int currCol;
for (int pos = this->lines[i]; pos < this->lines[i+1]; pos++) {
currCol = this->columns[pos];
if (currCol == j)
return this->values[pos];
else if (currCol > j)
break;
}
return NULL_TELEM;
构造函数如下:
Matrix::Matrix(int nrLines, int nrCols) {
if (nrLines <= 0 || nrCols <= 0)
throw exception();
this->nr_lines = nrLines;
this->nr_columns = nrCols;
this->values = new TElem[100];
this->values_capacity = 1;
this->values_size = 0;
this->lines = new int[nrLines + 1];
this->columns = new TElem[100];
this->columns_capacity = 1;
this->columns_size = 0;
for (int i = 0; i <= nrLines; i++)
this->lines[i] = NULL_TELEM;
}
这是“修改”方法:
TElem Matrix::modify(int i, int j, TElem e) {
if (i < 0 || j < 0 || i >= this->nr_lines || j >= nr_columns)
throw exception();
int pos = this->lines[i];
int currCol = 0;
for (; pos < this->lines[i + 1]; i++) {
currCol = this->columns[pos];
if (currCol >= j)
break;
}
if (currCol != j) {
if (!(e == 0))
add(pos, i, j, e);
}
else if (e == 0)
remove(pos, i);
else
this->values[pos] = e;
return NULL_TELEM;
}
这是插入方法:
void Matrix::add(int index, int line, int column, TElem value)
{
this->columns_size++;
this->values_size++;
for (int i = this->columns_size; i >= index + 1; i--) {
this->columns[i] = this->columns[i - 1];
this->values[i] = this->values[i - 1];
}
this->columns[index] = column;
this->values[index] = value;
for (int i = line; i <= this->nr_lines; i++) //changed to i = line + 1;
this->lines[i]++;
}
有人可以帮我吗?我不知道为什么会发生这种情况,这些天我真的需要完成此实现。
它只是不能通过下一个测试。如果我想打印元素,则我有(4,0)= 0(4,1)= 0 ...(4,8)= 0和(4,9)= 3。现在看来这很奇怪。
void testModify() {
cout << "Test modify" << endl;
Matrix m(10, 10);
for (int j = 0; j < m.nrColumns(); j++)
m.modify(4, j, 3);
for (int i = 0; i < m.nrLines(); i++)
for (int j = 0; j < m.nrColumns(); j++)
if (i == 4)
assert(m.element(i, j) == 3);
//cout << i << " " << j << ":" << m.element(i, j)<<'\n';
else
assert(m.element(i, j) == NULL_TELEM);
}
答案 0 :(得分:1)
当您使用空矩阵(全零)调用modify(1, 1, 5)
时,将导致对add(0, 1, 1, 5)
的调用。递增columns_size
和values_size
(都到1
),for循环体将不执行,将columns[0]
更新为1
和values[0]
到5
,然后从元素lines
开始递增所有lines[1]
的值,并将它们全部设置为1(lines[0]
仍为0
)。但是lines[1]
应该表示我们刚刚添加的元素,因此应该为0
,因为使用columns[0]
找到了该值。
add
末尾的for循环应从元素line + 1
开始。