21

Re: Вказівники і динамічна пам`ять при опрацюванні двовимірних масивів

XperiaNov написав:
    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;
}


Так само не потрібно зсувати стовпці, подвійний цикл замінюється одним

XperiaNov написав:
    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;
    }
Подякували: leofun01, volum, XperiaNov, LoganRoss4