2015-11-30 5 views
5

Sehen Sie bitte diesen Codeblock:Was genau tut typedef Strukturknoten {...} Knoten; vertreten?

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

In diesem Code ist Node auch auf struct node, wie typedef definiert sind, oder ist node auch auf struct? Wenn letzteres der Fall ist, ist struct node *next; gleich struct struct *next;?

Übertreibe ich Dinge?

+0

Ihre Struktur Teil eines Konstrukts ist in der Regel „verknüpfte Liste“ genannt verwenden. Suchen Sie danach, wenn Sie wissen wollen, wie man es benutzt und warum Sie 'struct node * next' geschrieben haben. Was Ihre Frage betrifft, müssten Sie mit 'struct node {...};' in Ihrem Code Variablen als 'struct node mynode1;' deklarieren. Mit 'typedef struct node Node;' müssen Sie nur 'Node mynode1' schreiben – frarugi87

+0

Ich denke, es erzeugt einen Fehler ...' Node * hashtable [SIZE] ', auf der anderen Seite, erzeugt ein Array mit SIZE Elementen; Jeder von ihnen ist ein Zeiger auf einen struct-Knoten (und da jede Struktur als Kopf einer Liste betrachtet werden kann, ist es ein Array von SIZE-Listen oder es kann ein Array mit Zeigern auf verschiedene Elemente derselben Liste sein hängt davon ab, wie Sie es verwenden) – frarugi87

+0

@ frarugi87 Warum deklariert 'int x;' einen Zeiger auf ein int namens x ohne einen Pointee, während 'Node * hashtable [SIZE];' ein Array von SIZE Zeigern deklariert, die auf 'Node' zeigen ('Node' ist der Anstoß)? – gabece

Antwort

11

verwenden Wenn Sie typedef Sie eine alias eines Typs erstellen.

Also ja, Node ist ein Alias ​​für struct node.


Auch der Code, den Sie haben, ist äquivalent zu

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

Die typedef ist nicht Teil der Strukturdefinition, es ist Teil der Node Definition.

+0

Danke für deine Antwort! Auch, Knoten * Hashtable [SIZE]; Deklarieren Sie einen Strukturzeiger auf ein Array mit dem Namen hashtable einiger Größe? – gabece

+0

@PurpleYoshiii Wenn Sie 'Node * hashtable [SIZE];' (beachten Sie den uppecase 'N' in' Node'), dann ist dies eine Deklaration eines Arrays von 'SIZE' Zeigern zu' Node'. Im Grunde ein Array von Listen in diesem speziellen Fall. –

+0

Also, 'Knoten * hashtable [SIZE];' deklariert ein Array von SIZE Zeigern, die auf 'Node' zeigen? Wenn das der Fall ist, warum deklariert 'int * x;' nur einen int-Zeiger mit dem Namen x ohne einen Verweis, während 'Knoten * hashtable [SIZE];' ein Array von SIZE-Zeigern deklariert, die auf 'Node' (' Node 'der Anstoß sein '. – gabece

4

Node ist auch struct node. Das ist, warum (für Beispiel) statt

struct node* p; 

One verwenden, können

Node* p; 
1

müssen Sie nicht mehr struct überall schreiben. Das spart nicht nur Tastenanschläge, es kann auch den Code sauberer machen, da es mehr Abstraktion bietet.

Sachen wie

typedef struct { 
    int x, y; 
} Point; 

Point point_new(int x, int y) 
{ 
    Point a; 
    a.x = x; 
    a.y = y; 
    return a; 
} 
1
typedef struct node 
{ 
    int data; 
    struct node *next; 
} 
Node; 

Dies kann einfach durch

struct node 
{ 
    int data; 
    struct node *next; 
}; 

    typedef struct node Node; 
verstanden werden
struct [structure tag or label] { 

    member definition; 
    ... 
    member definition; 
} [one or more structure variables]; 

neue Variable definiert werden als:

struct label <variable>; 

oder wenn Sie typedef struct Label verwenden, muss nicht jedes Mal zu definieren, neuen Strukturvariable d.h

typedef struct label Node; 

Jetzt Knoten Verwendung sein kann wiederholt werden, um neue ähnliche Art von Variable zu definieren.

+1

tatsächlich ist es' typedef struct node Node; ', nicht nur' node' – frarugi87

+0

T Hanks, das habe ich vergessen :-) –

2

In den grammatikalischen Strukturen C sind folgende Weise

definiert struct-oder-union-Spezifizierer:
        struct-or-union Kennung opt {struct-declaration-list}

Um diesen Strukturbezeichner zu beziehen, müssen Sie seinen Namen verwenden.

Sie können Variablen die folgende Art und Weise erklären

struct node 
{ 
    int data; 
    struct node *next; 
} Node; 

Hier Node ist ein Objekt vom Typ struct node. Der Reihe nach ist struct node ein Typspezifizierer der Variablen Node.

Sie können den Bezeichner in einem Strukturspezifizierer weglassen. In diesem Fall wird die Struktur unbenannte Struktur genannt. Wenn Sie jedoch eine solche Struktur verwenden, können Sie innerhalb der Definition nicht auf sich selbst verweisen. Zum Beispiel können Sie nicht schreiben

struct 
{ 
    int data; 
    struct *next; 
    ^^^^^^^^^^^^^ 
} Node; 

weil es unbekannt ist, welche Struktur hier bezeichnet wird.

Sie können unbenannte Strukturen als Elemente anderer Strukturen verwenden. In diesem Fall wird eine solche Struktur anonyme Struktur genannt und ihre Mitglieder werden Mitglieder der umgebenden Struktur.

Zum Beispiel

struct A 
{ 
    struct 
    { 
     int x; 
     int y; 
    ]; 
    int z; 
}; 

Diese Struktur A drei Mitglieder hat x, y und z.

Wenn der Speicherklassenspezifizierer verwendet wird, ist der Deklarator ein Bezeichner, der ein typedef-Name ist, der den für den Bezeichner angegebenen Typ angibt.

So in dieser Erklärung

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

Node ist nicht bereits ein Objekt. Es ist ein Typname, der den Strukturknoten bezeichnet.

ab sofort So können Sie Typnamen Node anstelle des Typspezifizierer struct node