Lassen Sie uns sagen, dass ich eine Liste Implementierung haben, die listnode_t
folgende Verwendungen:Differenzieren zwischen Stack und Heap-Speicher
typedef struct ListNode {
struct ListNode *next;
struct ListNode *prev;
void *value;
} listnode_t;
Dies ist eine doppelt verknüpfte Liste, wie Sie sehen können. Ich habe auch eine list_t
, die zwei Zeiger auf listnode_t
als erster und letzter Knoten und Größe der Liste haben. Jetzt asume Ich habe folgende in meinem Haupt
int main(int argc, char *argv[]){
...
// Create two empty lists
list_t *list1 = make_list();
list_t *list2 = make_list();
// Populate one with ints
int x = 4;
int y = 5;
list_push(list1, &x);
list_push(list1, &y);
// Populate other with strings
string_t *str1 = make_string("foo");
string_t *str2 = make_string("bar");
list_push(list2, str1);
list_push(list2, str2);
...
// Delete at the end
destroy_list(list1);
destroy_list(list2);
}
Ich habe ein Problem mit destroy_list
implementieren. Hier ist was ich versucht habe;
void destroy_list(list_t *list)
{
listnode_t *cur = list -> first;
for(cur = list -> first; cur != NULL; cur = cur -> next){
if(cur -> prev){
free(cur -> prev);
}
}
free(list -> last);
free(list);
list = NULL;
}
Mein Problem ist, dass ich versuche, void *
im listnode_t
zu verwenden, um der Lage sein, die allgemein diese Liste zu verwenden. Aber wenn ich Dinge lösche, scheint die Anwendung free(cur -> prev)
problematisch. Wenn ich eine Liste von Dingen wie Ints wie oben verwende, da diese auf dem Stack zugewiesen sind, geht es gut, denke ich. Aber wenn ich eine String-Liste wie oben hatte, muss ich, da ich die dynamische Zuweisung in meiner String-Implementierung verwende, zuerst free(cur -> prev -> value)
anwenden. Ich weiß nicht, wie kann ich das tun, weil, wenn ich es addiere, dann bekomme ich ein anderes Problem des Versuchens, einen Stapel zu befreien, der Gedächtnis auf dem Haupt zugeteilt wird.
Was soll ich tun, ich bekomme dieses generische Listenverhalten nicht.
Der Benutzer muss eine Funktion zur Verfügung stellen, um den "Wert" zu zerstören, da nur der Benutzer der Liste weiß, was gespeichert ist und was zu tun ist. Also muss 'make_list' als Parameter die Funktion haben, den Wert zu zerstören. –
Protip: Niemals jemals jemals eine verkettete Liste verwenden. Verlinkte Liste gehören in College-Campus Wände, nirgendwo sonst. –
Was ist die Definition von list_t? – levengli