Я пытаюсь создать библиотеку, которая обеспечивает простую реализацию связанного списка, а также несколько обобщений этого связанного списка, таких как стеки и очереди, все на основе базового связного списка.
Дело в том, что я хочу иметь разные типы с их собственными "частными" функциями, чтобы вы не использовали "stack_pull (my_queue);" или «queue_pull (my_stack)», что может привести к неправильному поведению для этого конкретного типа списка. Единственный способ представить, как это будет работать сейчас, - это обернуть базовую структуру связанного списка в другие структуры для их собственных типов, как это в основном
typedef struct node
{
void *data;
list_node *next;
} list_node
typedef struct list
{
list_node *root;
} linked_list;
typedef struct queue
{
linked_list *base;
} queue;
typedef struct stack
{
linked_list *base;
} stack;
linked_list *list_create();
void list_dispose(linked_list **, void (*free_content)(void *));
queue *queue_create();
void queue_dispose(queue **, void (*free_content)(void *));
stack *stack_create()
void stack_dispose(stack **, void (*free_content)(void *));
Таким образом, мне придется написать специализированные функции, чтобы использовать базовые функции и постоянное развертывание, чтобы добраться до фактических данных, например,
queue *queue_create()
{
[...] /* Allocate a new queue struct */
tmp_queue->base = list_create();
[...]
return tmp_queue
}
void *stack_pull(stack *s)
{
[...] /* Error checking */
return list_pop_last(s->base);
}
void *queue_pull(queue *q)
{
[...] /* Error checking */
return list_pop_first(s->base);
}
Это накладные расходы, с которыми мне придется смириться, если я хочу специализироваться из базового списка, или есть хороший и чистый способ?