Блок задач

1. Разгон

Темы
Сложность 2

Задача «Динамический массив»

Реализовать на языке C модуль для работы динамическим массивом записей.

Примерный интерфейс:

#include <stdbool.h> // bool
#include <stddef.h>  // size_t

void * darray_create(size_t itemSize);
void darray_destroy(void * darray, void(*destroy)( void * ));

void * darray_init(void * darray, size_t itemSize);
void darray_clear(void * darray, void(*destroy)( void * ));

size_t darray_count(const void * darray);
void * darray_item(void * darray, size_t i);
void * darray_add(void * darray);
void * darray_insert(void * darray, size_t i);
void darray_remove(void * darray, size_t i, void(*destroy)( void * ));

size_t darray_first(const void * darray);
size_t darray_last(const void * darray);
size_t darray_next(const void * darray, size_t item_id);
size_t darray_prev(const void * darray, size_t item_id);
size_t darray_stop(const void * darray);
void * darray_current(const void * darray, size_t item_id);
void darray_erase(void * darray, size_t item_id, void(*destroy)( void * ));
  • darray_create -- Создать новый пустой динамический массив. Размер элемента -- itemSize байт.
  • darray_destroy -- Удалить существующий динамический массив. Если указана функция destroy, то вызвать её для каждого удаляемого элемента.
  • darray_init -- Инициализировать динамический массив. Размер элемента -- itemSize байт.
  • darray_clear -- Удалить все элементы из динамического массива. Если указана функция destroy, то вызвать её для каждого удаляемого элемента.
  • darray_сount -- Количество элементов в массиве.
  • darray_item -- Получить элемент по индексу в массиве.
  • darray_add -- Добавить элемента в конец динамического массива. В случае успеха, функция возвращает указатель на добавленный элемент, иначе -- NULL.
  • darray_insert -- Вставить элемент в середину динамического массива. В случае успеха, функция возвращает указатель на добавленный элемент, иначе - NULL.
  • darray_remove -- Удалить из массива элемент по индексу. Если указана функция destroy, то вызвать её для удаляемого элемента.
  • darray_first -- Идентификатор для первого элемента из динамического массива. Идентификатор становится невалидным при модификации динамического массива.
  • darray_last -- Идентификатор для последнего элемента из динамического массива. Идентификатор становится невалидным при модификации динамического массива.
  • darray_next -- По идентификатору текущего элемента получить идентификатор следующего элемента массива.
  • darray_prev -- По идентификатору текущего элемента получить идентификатор следующего элемента массива.
  • darray_stop -- Идентификатор, получаемый при попытке получить доступ к элементу за пределами массива.
  • darray_current -- Получить указатель на элемент массива по его идентификатору.
  • darray_erase -- Удаление элемента по его идентификатору. Если указана функция destroy, то вызвать её для удаляемого элемента. После удаления элемента из массива, идентификаторы любых элементов из этого массива становятся невалидным.