Ich versuche, eine Bibliothek zu erstellen, die eine einfache Verkettungslistenimplementierung und auch einige Verallgemeinerungen dieser verketteten Liste, wie Stapel und Warteschlangen, alle basierend auf der verknüpften Basisliste bereitstellt.Guter Bibliotheksentwurf für "überlappende" Funktionalität
Die Sache ist, ich möchte unterschiedliche Typen mit ihren eigenen "privaten" Funktionen haben, so dass Sie nicht "stack_pull (my_queue)" verwenden würden; oder "queue_pull (my_stack)", was zu einem falschen Verhalten für diesen speziellen Listentyp führen würde. Der einzige Weg, kann ich mir vorstellen, wie das jetzt funktionieren würde, ist durch die Grund verknüpften Liste Struktur in anderen Strukturen für ihre eigenen Arten wickeln, wie dieser im Grunde
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 *));
Auf diese Weise werde ich die speziellen Funktionen schreiben müssen, um Nutzung der Basisfunktionen und konstant machen auspackt um die tatsächlichen Daten zu erhalten, zum Beispiel
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);
}
ist das ein Overhead, mit dem ich leben würde, wenn ich von einer Grundliste spezialisieren will, oder ist es ein schöne und sauberer Weg?
Eigentlich habe ich die Struktur in dieser Frage vereinfacht, meine tatsächliche linked_list enthält auch ein Längenfeld, so dass man nicht die ganze Liste laufen muss, um die Anzahl der Elemente darin zu zählen! – LukeN