Первый typedef
определяет node
как псевдоним для struct node
, чтобы вы могли ссылаться на него просто как node
без записи struct node
каждый раз (в C "обычные" имена типов и struct
имена живут в двух разных пространствах имен). Это эквивалентно:
struct node
{
int value;
struct node* rest;
};
typedef struct node node;
Второй typedef
вместо этого определяет list
как псевдоним для node *
, то есть определяет тип list
как указатель на структуру node
.
(кстати, лично я нахожу, что это очень плохой стиль: скрывать указатели внутри typedef
s почти всегда плохая идея; можно утверждать, что указатель на первый элемент в списке может быть идентифицирован как список, но использование list
даже для указателя rest
ИМХО не очень приятно)