Добавление строки в двумерый динамический массив, не используя дополнительный массивов. C++
Даны N - количество строк матрицы, M - количество столбцов матрицы и сама матрица целых чисел. Добавить строку со всеми 0 после строки с максимальным элементом (массив динамический, дополнительных массивов не использовать). Написал код, но он не работает корректно. Какие ошибки в моём коде?
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
// инициализация массива
int** init(int n, int m)
{
int i;
int** matr;
matr= (int**)malloc(n*sizeof(int*));
for (i = 0; i < n; i++)
*(matr+i) = (int*)malloc(m * sizeof(int));
return matr;
}
// заполнение массива
void input(int** matr, int n, int m)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> matr[i][j];
}
//вывод массива
void output(int** matr, int n, int m)
{
for (int i = 0; i < n; i++)
for (int j = 0; i < m; j++)
{
cout << setw(4) << matr[i][j];
cout << endl;
}
}
//определение индекса строки с максимальным элементом
int index(int** matr, int n, int m)
{
int max = matr[0][0];
int ind = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (matr[i][j] > max)
{
max = matr[i][j];
ind = i;
}
}
return ind;
}
//увеличение размера матрицы и заполнение нужной строки нулями
int** add_line(int** matr, int* n, int m, int ind)
{
(*n)++;
matr = (int**)realloc(matr, (*n) * sizeof(int*));
for (int j=(*n)-1;j<*n;j++)
matr[j] = (int*)calloc(m, sizeof(int));
for (int i = (*n) - 1; i > ind; i--)
for (int j = 0; j < m; j++)
matr[i][j] = matr[i - 1][j];
for (int i = ind + 1; i < ind + 2; i++)
for (int j = 0; j < *n; j++)
matr[i][j] = 0;
return matr;
}
int main()
{
int** matr, M, N;
cin >> N;
cout << endl;
cin >> M;
cout << endl;
matr = init(N, M);
input(matr, N, M);
int ind = index(matr, N, M);
matr = add_line(matr, &N, M, ind);
output(matr, N, M);
return 0;
}
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
После realloc у вас остается n-1 действительных указателей на имеющиеся строки. Выделить память нужно только под одну - последнюю - строку.
И нулями заполнять одну строку нужно правильной длины
int** add_line(int** matr, int* n, int m, int ind)
{
(*n)++;
matr = (int**)realloc(matr, (*n) * sizeof(int*));
matr[(*n) - 1] = (int*)malloc(m * sizeof(int));
for (int i = (*n) - 1; i > ind; i--)
for (int j = 0; j < m; j++)
matr[i][j] = matr[i - 1][j];
for (int j = 0; j < m; j++)
matr[ind+1][j] = 0;
return matr;
}
Ещё:
void output(int** matr, int n, int m)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
{
cout << setw(4) << matr[i][j];
}
cout << endl;
}
}
1 2 3
7 8 9
4 5 6
1 2 3
7 8 9
0 0 0
4 5 6