Wie definiere ich eine Typedef-Struktur, die Zeiger auf sich selbst enthält?

Lesezeit: 3 Minuten

Benutzeravatar von Kenny Cason
Kenny Cason

Ich schreibe eine LinkedList in C, der folgende Code repräsentiert meine Node-Definition.

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

Ich verstehe (oder denke, dass ich es tue). struct Node nicht das Selbe wie typedef struct Node. Zugegeben, mein Code wird kompiliert und ausgeführt, wie er soll, aber ich erhalte viele Warnungen beim Zuweisen next und prev (Warnung: Zuweisung von inkompatiblem Zeigertyp). Ich vermute, dass dies damit zu tun hat, wie ich sie in der Knotenstruktur definiere. Ich habe die vollständige Quelle hochgeladen hier

Also, wenn das tatsächlich das Problem ist, wie soll ich es definieren? next und prev innerhalb der typedef struct Node?

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

  • Ihre verknüpfte Liste sieht für mich sehr seltsam aus. Wenn Sie prev und next haben, warum brauchen Sie dann Kopf und Zahl? Finden Sie eine gute verknüpfte Liste in C und lernen Sie daraus. Ich würde die Apache Runtime Library empfehlen. Ich denke, es hat eine verknüpfte Liste.

    – frech

    21. Oktober 2010 um 13:49 Uhr


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

    – Kenny Cason

    21. Oktober 2010 um 13:52 Uhr


  • Die Warnungen kommen, wenn Sie es versuchen my_node->next = my_other_node

    – Josiah Yoder

    12. September 2018 um 19:42 Uhr

Benutzeravatar von unwind
entspannen

Sie müssen es in dieser Reihenfolge tun:

typedef struct Node Node;

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

Das macht nicht genau das, was Sie gefragt haben, aber es löst das Problem und so wird dies im Allgemeinen gemacht. Ich glaube nicht, dass es einen besseren Weg gibt.

Diese Art der Vorwärtsdeklaration hat eine zweite Verwendung, nämlich das Verbergen von Daten. Wenn die Liste in einer Bibliothek implementiert wurde, könnten Sie genau die haben typedef im öffentlichen Header, 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 haben Benutzer der Bibliothek keinen einfachen Zugriff auf die Interna Ihrer Bibliothek, dh die Felder der Node Struktur.

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

    – Eric Türme

    21. Oktober 2010 um 13:44 Uhr

  • Oh wow. Ich glaube, ich habe jede Kombination ausprobiert, außer dieser einen! Danke! Warnungen alle weg! 🙂

    – Kenny Cason

    21. Oktober 2010 um 13:45 Uhr

  • Eigentlich hätte es funktioniert, einfach hinzuzufügen Node nach dem ersten struct im OP-Code.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    21. Oktober 2010 um 15:24 Uhr

  • @R .. Danke Das hat auch bei mir funktioniert. Gibt es eine Präferenz zwischen den beiden genannten Methoden?

    – Kenny Cason

    21. Oktober 2010 um 15:44 Uhr

  • Beides ist genauso gut. Persönlich verwende ich normalerweise nur eine separate Forward-Deklaration und typedef (wie in der Antwort von Unwind), wenn ich die Deklaration in einen Header und die Definition in eine Implementierungsdatei einfügen möchte.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    21. Oktober 2010 um 16:01 Uhr

Ein weiterer akzeptabler Weg und mit der geringsten Änderung des OP-Codes ist der folgende:

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

Beachten Sie die Einführung von NodeT und seine Verwendung in next und prev bis um Node ist verfügbar.

  • Dies ist eigentlich das, was ich in meiner Implementierung getan habe. 🙂 pro Kommentar von @R.

    – Kenny Cason

    21. Oktober 2010 um 17:53 Uhr

1404170cookie-checkWie definiere ich eine Typedef-Struktur, die Zeiger auf sich selbst enthält?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy