2014-12-01 3 views
1
struct node 
{ 
    int data; 
    struct node *next; 
}*head; 

Почему у нас есть * голова? И это отличается (лучше?), Чем делатьОбъявление структур в C

typedef struct 
{ 
    int data; 
    struct node *next; 
}head; 
+0

Я думаю, что это лучше в «стиле» смысле ... Я имею в виду, «узел» будет использоваться в возможной «TAD», так что «голова» (как правило, при работе со списками) необходимо быть указателем, поэтому вы объявляете его, когда вы определяете узел struct, и не выполняете его позже в коде явно. – FacundoGFlores

ответ

3

Первый раздел определяет переменную head, которая является указателем на тип struct node. Он может быть NULL, указывая, что ваш связанный список имеет нулевые элементы.

Второй блок просто объявляет тип, называемый head. Это не переменная. И он не компилируется, поскольку тип его поля next, struct node, не существует.

Вы, вероятно, хотели

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

Эта форма объявляет 2-х типов, struct node и node (то же самое), и определяет переменную head. Я бы пошел на 1-ю форму без typedef, так как это более просто, и вы все равно не можете ссылаться на typedef внутри поля структуры next.

2

Первая версия объявляет тип (struct node), и переменная head, которая является указателем на struct node. Все списки нуждаются в голове, так что это полезно.

Второе объявляет head как имя типа для (в противном случае не указано) struct. Он фактически не будет компилироваться, поскольку внутренний struct node *next относится к типу, который не существует.

0

В первом примере вы определяете struct, но также объявляете переменную head указателем на такой struct.

В вашем втором примере (typedef) вы просто объявить какой синоним типа (но нет переменных!)

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

в коде выше, вы должны объявить объект голову как указатель так, чтобы получить доступ к его элементу данные, которые необходимо использовать -> оператор, например head-> data = 4; и так далее

вы можете создать узлы для добавления головного указателя

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

, где, как в этом коде каждый узле, который вы создаете, будет голова типа он будет создавать проблемы при удалении узла головки, если вы пишете код связанного списка для удаления головы, вы не можете переопределить новую голову

, где, как и в предыдущем заголовке кода, это указатель, можно изменить, обновив его следующий элемент в структуре после обновления head-> next в предыдущем коде. может затем легко удалить предыдущую голову, не потеряв новую голову

0
the gdb debugger (and perhaps other debuggers) 
can only see the contents/format of a struct that contains a tag name. 

The use of a typedef hides the tag name and defines a new type. 
however, gdb will not properly display the contents of any instance of the struct. 

The correct way is: 
struct tagname { ... }; 

Notice no struct name to clutter the symbol table and create confusion 
Of course, then each defining instance of this struct needs to be written as: 
struct tagname myName; 
but that should not be a problem and adds the visible documentation 
that myName is a struct 

Along with the increased visibility of the struct, both to gdb and the reader 
of the resulting code, any pointer to that struct should never be defined 
as part of the struct definition. Such a formatting hides the 
fact that such name is a pointer. rather declare an instance of a pointer as: 
struct tagname * pMyStruct; 

And, never use this syntax: 
struct { ... } structName; 
as that is a depreciated syntax 
Смежные вопросы