2011-10-29 10 views
12
struct node 
{ 
    int coef; 

    int exp; 

    struct node *link; 
}; 

typedef struct node *NODE; 
+6

Proszę nie chować typy wskaźnika tył typedefs w rzeczywistym kodzie though . –

+2

zły smak. SCNR – ninjalj

+0

jaki byłby lepszy sposób napisania tego kodu.W strukturze książki jest używany na 3 do 4 sposobów ... – Skr

Odpowiedz

7

To sprawia, że ​​NODE jest typedef dla struct node *.

+1

jaki byłby lepszy sposób napisania tego kodu ... zachowując to samo znaczenie. – Skr

+3

Lepszym sposobem byłoby pominięcie parametru typedef i określenie typu wskaźnika jako "węzeł struktury". –

18

Definiuje NODE jako synonim rodzaju struct node *, więc kiedy będziesz deklarując zmienną typu NODE będziesz faktycznie deklarując wskaźnik do struct node.

Osobiście uważam, że taka deklaracja nie jest dobrym pomysłem: "ukrywasz wskaźnik" (co jest prawie zawsze złym pomysłem), a ponadto nie podkreślasz tego faktu w żaden sposób w nowe imię.

+4

+1 dla "Nie ukrywaj typów wskaźników za typem" –

+1

+1 z tego samego powodu. Nazwanie jej 'nodeptr' zamiast' węzła' może pomóc, ale nie ma powodu, aby w ogóle to robić. –

+1

"Nie ukrywaj typów wskaźników za typedef" co masz na myśli przez to – Skr

7

NODE staje się pseudonimem dla struct node*.


EDIT: Dobra, za komentarz (jeśli piszę moją odpowiedź jako komentarz, to byłoby zbyt długo i nie sformatowany):

Nie ma innego sposobu, aby napisać to. Tutaj, typedef służy tylko do utworzenia synonimu/aliasu dla wskaźnika na struct node.
Przykładem użycia może być:

void f() 
{ 
    // some code 
    NODE p = NULL; 
    // do something with p 
    // for example use malloc and so on 
    // like: p = malloc(sizeof(struct node)); 
    // and access like: p->coef = ..; p->expr = .. 
    // do something with p and free the memory later (if malloc is used) 
} 

jest taka sama jak

void f() 
{ 
    // some code 
    struct node* p = NULL; 
    // do something with p 
} 

Korzystanie NODE czyni go tylko krótszą (tak, nie radzę taką typedef, jak ukrywasz, że jest to wskaźnik , a nie inny, jak wspomniano w odpowiedzi @Matteo Italia).


Format, o którym mowa: "typedef struct {} type_name format" to coś innego. To jest trochę sztuczka w C, aby uniknąć pisania słowa kluczowego struct (jak to jest obowiązkowe w C, a NIE w C++). Więc

typedef struct node 
{ 
    //.. 
} NODE; 

stałaby NODE alias struct node. Tak, ten sam przykład jak powyżej:

void f() 
{ 
    // some code 
    NODE p; 
    // do something with p 
    // note that now p is automatically allocated, it's real struct 
    // not a pointer. So you can access its members like: 
    // p.coef or p.expr, etc. 
} 

jest taka sama jak

void f() 
{ 
    // some code 
    struct node p; 
    // do something with p 
} 

Zauważ, że teraz, p jest NIE wskaźnik, to struct node.

+0

można napisać ten sam kod w inny sposób. jak napisać ten sam kod w typedef struct {} type_name; format??? – Skr

+0

Cóż, zobacz moją edycję, mam nadzieję, że będzie to bardziej jasne. –

+0

dziękuję bardzo, mam to tym razem. – Skr

-3

co oznacza typedef struct node *NODE?

oznacza to osoba, która nie dowiedział się, że UPPERCASE ma dobrego

Reserve wszystkie wielkie identyfikatory dla makr.

Cheers & HTH.,

+0

Nie sądzę, że dobrym pomysłem jest, aby 'NODE' zawierał' * ' –

+0

@ PeterLee: Dzięki, nie wspomniałem o tym. Hm, dziwię się, że najbardziej przecząca odpowiedź to odpowiedź, która * nie * odpowiada na pytanie o to, co to "wskazuje", i że ta odpowiedź, jako jedyna odpowiedź na to pytanie, została odrzucona. Taki jest SO. –

+0

Nawet jeśli jesteś bardzo solidny i fajny. Nawet jeśli masz dobre wskazówki dotyczące tej sprawy. Nie jest zbyt dobrym pomysłem poniżanie ludzi. B.t.w. nie jest właściwą odpowiedzią na to pytanie. To jest główna przyczyna, dla której można znaleźć odpowiedź. – I159

0

po prostu mówi można utworzyć wskaźnik typu węzła przy użyciu tylko NODE za każdym razem zamiast napisać węzeł struct * Everytime