2010-10-21 7 views
28

Ich schreibe eine LinkedList in C, der folgende Code repräsentiert meine Node-Definition.Wie definiert man eine Typedef-Struktur, die Zeiger auf sich selbst enthält?

typedef struct { 
    int value; 
    struct Node* next; 
    struct Node* prev; 
} Node; 

Ich verstehe (oder denken, dass ich), dass struct Node nicht das gleiche wie typedef struct Node. Zugegeben, mein Code kompiliert und läuft so, wie es soll, aber ich bekomme viele Warnungen bei der Zuweisung next und prev (Warnung: Zuweisung von inkompatiblen Zeigertyp). Ich vermute, dass das damit zu tun hat, wie ich sie in der Knotenstruktur definiere. Ich hochgeladen die vollständige Quelle here

Also, wenn das in der Tat das Problem ist, wie soll ich definieren next und prev innerhalb der typedef struct Node?

Ich war besorgt, dass dies ein Repost sein könnte, aber konnte nicht ganz finden, was ich suchte. Vielen Dank.

+0

Ihre verknüpfte Liste sieht mir sehr fremdartig aus. Wenn du prev und next hast, warum brauchst du dann Kopf und Schwanz? Finden Sie eine gut verlinkte Liste in c und lernen Sie daraus. Ich würde die Apache-Laufzeitbibliothek empfehlen. Ich denke, es hat eine verknüpfte Liste. – frast

+2

mit Zeigern zu Kopf und Schwanz machen anhängen und vor O (1) anstelle von O (n). Lassen Sie mich wissen, wenn Sie andere Fehler sehen, da dies hauptsächlich eine Übung ist, um meine C-Fähigkeiten nach all den Jahren von Java etwas frisch zu halten. –

Antwort

55

Sie müssen sie in dieser Reihenfolge tun:

typedef struct Node Node; 

struct Node 
{ 
    int value; 
    Node *next; 
    Node *prev; 
}; 

Das ist nicht genau das tut, was Sie gefragt, aber es löst das Problem und ist, wie dies in der Regel geschieht. Ich glaube nicht, dass es einen besseren Weg gibt.

Diese Art von Forward-Deklaration hat eine zweite Verwendung in Data Hiding. Wenn die Liste in einer Bibliothek implementiert wurde, können Sie nur die typedef im öffentlichen Header haben, zusammen mit Funktionen wie:

Node * list_new(void); 
Node * list_append(Node *head, Node *new_tail); 
size_t list_length(const Node *head); 

Auf diese Weise, den Benutzern der Bibliothek nicht über einen einfachen Zugang zu den Interna Ihrer Bibliothek, dh die Felder der Struktur Node.

+2

Ja. Eine Vorwärtsdeklaration (http://en.wikipedia.org/wiki/Forward_declaration) ist genau das, was benötigt wird. –

+0

Oh wow. Ich glaube, ich habe jede Kombination ausprobiert, außer dem einen! Vielen Dank! Warnungen alle weg! :) –

+0

Richtig, ich bin mir der Vorwärtsdeklarationen bewusst und benutze sie in C++, aber ich hatte nie zuvor diesen speziellen Umstand, geschweige denn mit typedef/structs :) –

17

Eine andere akzeptable Art und Weise und mit dem geringsten Änderungscode zu OPs ist die folgende:

typedef struct NodeT { 
    int value; 
    struct NodeT * next; 
    struct NodeT * prev; 
} Node; 

Notiere die Einführung von NodeT und seine Verwendung in next und prev bis Node zur Verfügung steht.

+0

Dies ist tatsächlich, was ich in meiner Implementierung getan habe. :) per @R ..'s Kommentar –

Verwandte Themen