Мне нужно реализовать матричную структуру данных CSR в C ++ с использованием 3 динамических c массивов (индексация начинается с 0), и я застрял. Поэтому мне нужно реализовать 2 функции:
1) modify(int i, int j, TElem e)
- изменяет значение (i, j) на e или добавляет if (если оно не существует) или удаляет его, если e равно null.
2) element(int i, int j) const
- возвращает значение, найденное для (i, j)
Я хотел проверить свой код следующим образом:
Matrix 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.
Это моя реализация элемента (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]++;
}
Может кто-нибудь помочь мне, пожалуйста? Я не могу понять, почему это происходит, и мне действительно нужно завершить sh эту реализацию в наши дни.
Она просто не может пройти следующий тест. И если я хочу напечатать элементы, у меня есть (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);
}