Компилятор видит объявление
void push(struct list, int);
, после чего он встречает этот вызов
push(&list, 70);
, где первый аргумент имеет тип struct list **
. И выдает ошибку, что тип параметра функции struct list
и тип выражения аргумента struct list **
несовместимы.
Объявление функции без определения не совпадает с объявлением функции с определением после функция главная.
Но в любом случае определение функции недопустимо.
Это утверждение внутри функции
*list->next = new;
неверно. Это эквивалентно
*( list->next ) = new;
, где указатель list
, имеющий тип struct list **
, указывает на указатель, а не на объект структуры. То есть указанный указатель не имеет элемента данных next
. И компилятор сообщает об этом
lista. c: 37: 8: ошибка: запрос на член 'next' в чем-то, не являющемся структурой или объединением
Функция должна быть объявлена следующим образом
int push( struct list **, int );
и определена как
int push( struct list **list, int info )
{
struct list *new_node = malloc( sizeof( struct list ) );
int success = new_node != NULL;
if ( success )
{
new_node->info = info;
new_node->next = *list;
*list = new_node;
}
return success;
}
И в основном нет необходимости выделять головной узел вне функции push
.
Вы должны написать
int main( void )
{
struct list *list = NULL;
push( &list, 5 );
push( &list, 70 );
return 0;
}