Как бы я перераспределить 2-мерный массив в C? - PullRequest
0 голосов
/ 19 февраля 2019

Я выполняю задание по программированию на С, в котором я читаю количество столбцов и строк от пользователя и создаю двумерный массив на основе введенных данных и заполняю записи случайными значениями.Как мне удалить определенный столбец в моем двумерном массиве на основе введенных пользователем данных (например, если пользователь хочет удалить первый столбец, как бы я перераспределил пространство матрицы?)

#include <stdio.h>
#include <stdlib.h>

double **initializeRandomMatrixPtr(double **a, int rows, int cols) {
    a = malloc(rows * sizeof(double *));
    for (int i = 0; i < rows; i++) {
        *(a + i) = malloc(cols * sizeof(double));
        for (int j = 0; j < cols; j++) {
            *(*(a + i) + j) = rand();
        }
    }
    return a;
}

void printMatrix(double **matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

void freeMatrix(double **matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

int main(void) {
    int rows = -1;
    int cols = -1;
    int deletedColumn = -1;
    // remove first column
    printf("Enter number of rows:");
    scanf("%d", &rows);
    printf("Enter number of cols:");
    scanf("%d", &cols);
    double **matrix = initializeRandomMatrixPtr(matrix, rows, cols);
    printMatrix(matrix, rows, cols);
    freeMatrix(matrix, rows, cols);
    printf("What column do you want to delete?");
    scanf("%d", deletedColumn);
    realloc(matrix, ) // what should I put for my second parameter?
    return 0;
}

1 Ответ

0 голосов
/ 19 февраля 2019

Поскольку это домашнее задание, я не собираюсь публиковать какой-либо код:

Чтобы перераспределить ваш массив массивов, на 1 запись (одна строка или столбец) меньше:

  1. Перейдите во внешний массив к индексу / записи, которую нужно удалить, и вызовите free () для этого указателя.Это освободит все данные, связанные с этой строкой / столбцом / списком.
  2. Если ожидается, что массив будет оставаться непрерывным (вероятно, так и есть), вам нужно либо вызвать memmove (не memcpy), либо использовать цикл forскопируйте указатели во внешнем цикле из 1 после записи удаления в конец внешнего цикла в промежуток, созданный удаленной записью.
  3. Наконец, вам необходимо вызвать realloc для внешнего массива, уменьшивнеобходимый размер на 1 указатель.

Возможно, вам также понадобится отслеживать состояние этого массива, сохраняя как минимум количество записей в вашем внешнем массиве указателей на указатели - чтобы вы не могли прочитать прошлоеконец списка нового размера, когда приходит время снова напечатать размер или изменить его размер или что-то еще.

В случае, если вы пытаетесь удалить записи в другом направлении (1 запись на выделение из внешнего цикла)процесс аналогичен:

Посетите каждую запись во внешнем цикле и выполните следующее:

  1. Вызовите memmove () или для копирования цикла из 1 после записи для удаления в запись (будьте осторожны, чтобы не читать конец массива).
  2. вызовите realloc () для этой записи с новым, меньшим размером 1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...