2017-11-17 6 views
2

Also versuche ich, eine verknüpfte Liste zu implementieren, und ich habe diese Struktur für jeden der Knoten:Wie ändert man Zeigervariablen innerhalb einer Struktur?

typedef struct listNode { 
     struct listNode *next; 
     void *data; 
    } NODE; 

Zuvor ich ein Spiel gemacht hatte, wo das Raumschiff struct sah wie folgt aus:

typedef struct { 
     int height; 
     int width; 
    } SPACECRAFT; 

und ich konnte ein neues Raumschiff machen von

SPACECRAFT plyrShip = { 
     .width = //someInt; 
     .height = //someInt; 
    }; 

tun Obwohl mit den Knoten, die Variablen Zeiger sind und es mir ermöglicht es nicht, einen neuen zu erstellen node doing

NODE newNode = { 
     .*next = null; 
     .*data = *data //function has *data as parameter so I can pass it 
        //into the node 
    } 

Was mache ich falsch?

+7

Das '*' ist Teil des _type_, nicht des Feldnamens, also initialisierst du '.next', nicht'. * Next'. Zugegebenermaßen ist die Syntax "struct node * next" in dieser Hinsicht verwirrend und in der Tat bevorzugen viele Leute, struct node * next' zu schreiben, um das klar zu machen. – Ctx

+0

Also in diesem Fall sollte der Wert, den ich festlegte, eine Speicheradresse für den nächsten Knoten in der Liste sein? Oder der Knoten selbst? – DevAllanPer

+0

Ersteres, zum Beispiel mit NULL, wenn der Knoten keinen Nachfolger hat. – Ctx

Antwort

2

Sie haben die Zeigerdeklarationssyntax und die angegebene Initialisierungssyntax zusammengeführt. Ein Member-Feld kann als Zeigertyp deklariert werden. Benennen Sie das Feld bei benannten Initialisierern. Beachten Sie auch, dass sie durch Kommas getrennt sind.

NODE newNode = { 
     .next = null, 
     .data = data 
    }; 
+0

Also, wenn ich mit malloc Speicher dafür auf dem Heap reservieren wollte, was sollte ich tun? – DevAllanPer

+0

'Knoten * newNode = (Knoten *) malloc (sizeof (newNode));'? – DevAllanPer

+0

'Knoten * newNode = malloc (sizeof (* newNode));' – jxh

2

Offiziell heißt das Designated Initializer, das seit C99 eingeführt wurde.

Zuerst sollten Sie Pointer-Typen realisieren. struct listNode next; ist eine Variable next zu deklarieren, deren Typ struct listNode ist. struct listNode *next ist eine Variable zu deklarieren, next, deren Typ ist ein Typ, der auf einen Wert zeigt, dessen Typ struct listNode ist. Also solltest du es so machen.

NODE newNode = { 
    .next = null, 
    .data = data 
    } 

Darüber hinaus sieht diese Struktur wie im Speicher aus. Sie könnten sich daran erinnern, um Verwirrung zu vermeiden. Und das zeigt deutlich, warum Sie das nicht tun konnten. (das Element next in der Struktur kann aufgrund des Strukturlayouts hier nicht dereferenziert werden).

|--------------| 
| newNode.next | &newNode 
|--------------| 
| newNode.data | 
|--------------| 

Aktualisierte Antwort: Überprüfen Sie die Bearbeitungszusammenfassung.

Verwandte Themen