Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів
for (i=nMax; i>0; i--) // step 1 { for (k=0; k<m; k++) { t = a[i-1][k]; a[i-1][k] = a[i][k]; a[i][k] = t; } }
Нема потреби зсувати залишок матриці, досить просто обміняти місцями два рядки — перший і той, у якому максимальний елемент.
Тобто:
/ 1 2 3 \ / 7 8 9 \
| 4 5 6 | -> | 4 5 6 |
\ 7 8 9 / \ 1 2 3 /
А не
/ 1 2 3 \ / 7 8 9 \
| 4 5 6 | -> | 1 2 3 |
\ 7 8 9 / \ 4 5 6 /
Окрім того, ваш двовимірний масив — «векторизований», тобто побудований як вектор вказівників на вектори цілих.
Тому для обміну місцями двох рядків достатньо поміняти місцями ці вказівники.
if (r_max != 0) { /* взагалі нічого не робити, якщо максимум у рядку 0 */
int *t = a[0];
a[0] = a[r_max];
a[r_max] = t;
}
Так само не потрібно зсувати стовпці, подвійний цикл замінюється одним
for (k=max; k>0; k--) // step 2 { for (i=0; i<n; i++) { t = a[i][k-1]; a[i][k-1] = a[i][k]; a[i][k] = t; } }
if (c_max != 0)
for (i = 0; r < n; i++) {
int t = a[i][0];
a[i][0] = a[i][c_max];
a[i][c_max] = t;
}