2016-07-22 12 views
4

ich diese Struktur als eine verknüpfte Liste bin mit:verlinkte Liste Implementierung in C mit Struktur

typedef struct Node{ 
     int value; 
     struct node_t* next; 

}node_t; 

Und alles funktioniert gut, bis ich struct node_t* next vor int value Feld setzen, dann habe ich eine Menge Müll Werte der Arbeit mit diese Struktur. Geht es um eine falsche Implementierung oder etwas anderes im Code?

+1

In Ihrem Code 'node_t' ist jetzt ein Alias ​​für' struct Node'. Hoffnung, die hilft zu verstehen. – GergelyPolonkai

+0

Bitte lesen Sie die aktualisierte Antwort, verstehen Sie jetzt? –

Antwort

4

Sie rufen Ihre Struktur Node an und definieren einen node_t Typ. Dann verwenden Sie node_t, als wäre es der Name der Struktur und nicht der Typ.

Versuchen Sie, diese

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

Oder

typedef struct node Node; 
struct node { 
    int value; 
    Node *node; 
}; 

Wenn Sie es nennen struct Node, dann

struct Node { 
    int value; 
    /* The compiler doesn't know what `struct Node' is yet */ 
    struct Node *next; 
    /* But you can always declare pointers, even of types the compiler 
    * doesn't know everything about. Because the size of a pointer 
    * does not depend on the type of the pointee. 
    */ 
}; 

In Ihrem Beispiel ist es noch schlimmer. Sie typedef Ed etwas, das ein neuer Typ ist, wie der Compiler es verstehen, um es zu verwenden, müssen Sie struct nicht verwenden. Die ganze Idee hinter typedef ing ist, dass Sie einen neuen Typen DEFINIERT, so dass die folgenden

typedef struct Node node; 

dann einen Zeiger des Typs deklarieren node (Note, wieder node ist eine Art),

node *anode; 

aber Sie haben versucht, so etwas wie

struct node *anode; 

und es ist falsch, weil es n o struct node im obigen Code ist es struct Node.

Ein weiterer Fehler im Code ist, dass der node_t Typ nicht existiert, wenn der Compiler die

struct node_t *next; 

findet die bereits falsch ist, weil, wenn der Typ vor der Struktur definiert wurde, die wie diese

möglich ist
typedef struct Node node_t 

es würde immer noch falsch sein struct auf dem node_t Typ zu verwenden, da für den Compiler node_t keine struct ist es ist eine neue ty pe, was wiederum einfach ein Alias ​​für struct Node ist.

Typedefing Strukturen in meiner Erfahrung ist mehr Ärger als Nutzen sowieso. Und es ist nicht so schwer zu schreiben struct Something statt nur Something. Es hat auch den Vorteil, expliziter zu sein, wenn also ein anderer Programmierer Ihren Code liest, wird er sofort wissen, dass Something ein struct ist.

Hinweis: Ich änderte absichtlich den Namen node, weil es schlechte Praxis betrachtet hat Ihre eigenen definierte Typen mit _t Suffix. Es ist nicht unbedingt eine schlechte Sache, aber im Laufe der Jahre, die ich damit gearbeitet habe, habe ich einige Gewohnheiten entwickelt und eine von ihnen ist nicht _t als Suffix für meine eigenen definierten Typen zu verwenden. Die übrigens nur in meinem Code existieren, wenn sie die Lesbarkeit stark verbessern. Ansonsten verwende ich einfach den Namen der Struktur mit dem Schlüsselwort struct.

+0

Aber warum funktioniert es in eine Richtung, aber nicht in eine andere? – ead

+0

@ead Was meinst du? Wenn Sie darüber nachdenken, wie Sie es gemacht haben, ergibt das überhaupt keinen Sinn. Sie verwenden ein anderes Tag für die Struktur an zwei verschiedenen Orten, es macht keinen Sinn. Konsistenz ist sehr wichtig und selbst wenn Ihr Code sinnvoll wäre und korrekt kompiliert werden würde, ist es inkonsequent mit sich selbst, also ist es eine schlechte Übung. Sie sollten etwas über die Syntax lesen, um zu verstehen, was gültig und welche ungültige Syntax ist. Ich habe in [tag: c] für 5 Jahre oder so programmiert, und ich weiß immer noch nicht die ganze Syntax. Ich weiß, dass ich das nicht tue, weil ich oft etwas finde, das ich vorher nicht kannte. –

1

Sie verwenden einen nicht vorhandenen Typ node_t. Der Typ existiert nicht, da der Typ struct Node noch nicht vollständig ist und Sie seinen Alias ​​verwenden. Eine andere Sache zu erinnern, bei der Verwendung von typedefs mit Strukturen verwenden Sie nicht struct Schlüsselwort zusammen mit Alias ​​ z.

/* This is correct */ 
typedef struct Node 
{ 
    int x; 
    struct Node *next; 
} node_t; 

/* while these are incorrect */ 

/* Prefixing struct keyword to a typedef'ed type */ 
struct node_t *listhead; 

/* The type is inclomplete and you are using an alias of the type 
    which doesn't even exist */ 
typedef struct Node 
{ 
    int x; 
    node_t *next; 
}; 
1

Sie versuchen, einen Zeiger auf die Struktur zu erstellen, die Sie noch erstellen müssen. So sollte es gewesen sein,

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