Làm sao để thêm dòng vào ma trận

c++

(Ngô Anh Đức) #1

Em chào mọi người ạ.
Em đang có một ma trận mxn(bằng con trỏ cấp 2) và muốn thêm 1 dòng vào ma trận. Em đang gặp rắc rối ở đoạn cấp phát lại bộ nhớ cho ma trận .

Ý tưởng của em cấp phát là như sau ạ :

a = (int **)realloc(a, (m + 1) * sizeof(int));
realloc(a[m], n * sizeof(int));
...

Nhưng code chạy lỗi ạ, em cảm ơn.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void Nhap(int **a, int row, int column)
{
    int i, j;
    srand(time(0));
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < column; j++)
        {
            a[i][j] = -10 + rand() % 31;
        }
    }
}
 
void Xuat(int **a, int row, int column)
{
    int i, j;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < column; j++)
            printf("%4d", a[i][j]);
        putchar('\n');
    }
    putchar('\n');
}
 
int main()
{
    int **a, row, column;
 
    printf("Nhap so dong :");
    scanf("%d", &row);
    printf("Nhap so cot :");
    scanf("%d", &column);
 
    int i, j;
    a = (int **)malloc(row * sizeof(int));
    for(i = 0; i < row; i++)
    {
        a[i] = (int *)malloc(column * sizeof(int));
    }
 
    Nhap(a, row, column);
    Xuat(a, row, column);
 
    int vitrithem;
    printf("Nhap vi tri dong can them : ");
    scanf("%d", &vitrithem);
 
    a = (int **)realloc(a, (row + 1) * sizeof(int*));
    realloc(a[row], column * sizeof(int));
 
    for(i = row - 1; i > vitrithem; i--)
    {
        for(j = 0; j < column; j++)
        {
            a[i + 1][j] = a[i][j];
        }
    }
    for(j = 0; j < column; j++)
    {
        printf("Nhap a[%d][%d] : ", vitrithem, j);
        scanf("%d", &a[vitrithem][j]);
    }
    row++;
    Xuat(a, row, column);
 
    for(i = 0; i < row; i++)
    {
        free(a[i]);
    }
    free(a);
    return 0;
}

(aduka) #2

a[row]=(int*)malloc( column * sizeof(int));

a[row] trước đó chưa có nên phải cấp mới và

for(i = row - 1; i >= vitrithem; i--)

(>=vitrithem mới đúng nếu không hàng vitrithem chưa copy qua hàng vitrithem+1 đã bị nhập đè vào)

P/s: với lại nên viết hàm con ra, hàm cấp phát, nới, giải phóng… cho dễ kiểm tra.


89% Thành viên có cách giải cho một câu hỏi. Bạn thì sao?