C malloc, realloc.Как удалить один элемент из массива. - PullRequest
0 голосов
/ 17 мая 2018

У меня есть домашнее задание на создание 2 функций add , который добавляет элемент в динамический массив (что я сделал) и remove , который удаляет указанный элемент из этого массива.У меня проблема с этой 2-й функцией.Я понятия не имею, как его кодировать.PS.Я не могу использовать memmove ().

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

void print_array(int *tab, int n);
void add(int x, int y, int *tab, int idx);
void remove_element(int *tab, int idx, int array_length);


int main() {
        int *tab = malloc(24*sizeof(*tab));
        int  idx = 0;

        tab[idx++] = 44;
        tab[idx++] = 82;
        tab[idx++] = 57;
        tab[idx++] = 77;

        printf("Before insert\n");
        print_array(tab, idx);

        idx++;
        add(7, 0, tab, idx);

        printf("After insert\n");
        print_array(tab, idx);
        free(tab);

        idx--;
        printf("After delete\n");
        remove_element(tab, 3, idx);

        print_array(tab, idx);
        free(tab);
    return(0);
}

void print_array(int *tab, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("t[%d] = %d\n", i, tab[i]);
    }
}

void add(int x, int y, int *tab, int idx) {
        int i;
        for (i = idx; i > y; i--) {
            tab[i] = tab[i-1];
        }
        tab[y] = x;
}


void remove_element(int *tab, int idx, int array_length) {
    void *tmp = realloc(tab, (array_length - 1) * sizeof(int) );
    array_length = array_length - 1;
    tab = tmp;
}

1 Ответ

0 голосов
/ 17 мая 2018

О вашем массиве вы можете хранить информацию о его размере (например, iSize) и количестве используемых элементов (например, iUse). iUse<=isize, конечно.

Когда вам нужно добавить элемент, но массив слишком мал (iUse==iSize), вы увеличиваете его размер, добавляете элемент и увеличиваете iUse.

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

...