Я очень давно не программировал на чистом Си :( У меня началось
смешение того, что есть в Си, что есть в С++ и что есть в С#.
Конструкция
struct Имя_типа { ... };
в чистом Си НЕ ОБЪЯВЛЯЕТ тип с именем Имя_типа! В файле student_bad.c я
так пытаюсь описать и использовать структуру Student, описывающую
(частично) студента. Однако компиляция этого файла неуспешна, ошибка -
тип Student не описан!
После такого описания тип создается, но называется он struct Имя_типа -
со словом struct! В файле student_struct.c структура Student
используется именно таким образом. Этот файл уже успешно компилируется.
Соответственно, структуру узла списка можно описать с использованием
расширенного именования struct Node - см. файл list_tag.c
Однако при использовании типа не хотелось бы таскать за собой слово
struct; в файле list_tag.c видно, насколько это выглядит громоздко. В
таком случае можно описать АНОНИМНУЮ структуру, не имющую собственного
имени, но тут же дать ей имя-синоним через конструкцию typedef:
typedef struct { ... } Имя_типа;
Например (см. файл student_type.c):
typedef struct {
int age;
double avMark;
} Student;
В таком случае далее мы используем тип Student без слова struct.
Такой подход, тем не менее, не годится в нашей задаче создания структуры
списка, поскольку уже внутри структуры нам нужен тип структуры, чтобы
описать указатель. Поэтому можно совместить описание типа и присвоение
ему синонима (файл list_notag.c):
typedef struct tagNode {
int data;
struct tagNode *next;
} Node;
В таком описании самой структуре традицинно дают имя, получающееся
приписыванием слова "tag" к имени синонима: Node -> tagNode. Но это
необязательно - можно дать любое другое допустимое имя, в том числе и
Node: смешения Node и struct Node не происходит.
Как видно, в этом случае полное именование типа struct tagNode
используется только в определении типа поля next при описании самой
структуры; во всех других случаях используется короткий синоним Node.
Оба файла, list_notag.c и list_tag.c, дают рабочую програму:
$ gcc -o list_tag list_tag.c
$ ./list_tag
[]
[1]
[2, 1]
[5, 2, 1]
[10, 5, 2, 1]
$ gcc -o list_notag list_notag.c
$ ./list_notag
[]
[1]
[2, 1]
[5, 2, 1]
[10, 5, 2, 1]
Сергей Кумков
------------------------------
ssk...@gmail.com
Skype: sskumk
mobile:
+7(922)2057287
on this number:
WhatsApp, Telegram, Viber
------------------------------