Я пишу реализацию двусвязного списка, и у меня проблемы с добавлением в него элементов ...
Сам элемент выглядит так:
typedef struct list_item {
struct list_item* next; //указатель на следующий элемент
struct list_item* prev; //указатель на предыдущий элемент
void* data_ptr; //указатель на данные
size_t data_size; //размер данных
} list_item_t;
А вот функция, которая добавляет новый элемент с данными:
void list_add_data(list_t* list, void* data, size_t data_size);
Проблема в том, что я не могу добавить к нему, например, числа 10 и 12, поэтому мне нужно сделать что-то в стиле:
int num = 10;
int num2 = 12;
list_add_data(&list, &num, sizeof(int));
list_add_data(&list, &num2, sizeof(int));
или
int* num = malloc(sizeof(int));
*int = 10;
list_add_data(&list, num, sizeof(int));
num = malloc(sizeof(int));
*int = 12;
list_add_data(&list, num, sizeof(int));
И если вам нужно добавить несколько значений, вам нужно создать отдельную переменную для каждого значения или выделить память и отслеживать ее. Очевидно, что это не работает.
Я мог бы создать отдельную функцию для всех типов, например, void list_add_int(list_t* list, int data);
, которая будет выделять память для числа и сохранять ссылку, но в этом случае для каждого возможного типа Я должен создать отдельный экземпляр функции, это тоже не решение.
Могу ли я сделать что-то похожее на типы данных в C ++? Что-то похожее на vector<int> vec;
и простые функции, которые будут работать с элементами того типа, который требуется.