указатель на неполный тип класса не разрешен — односвязный список

#c

#c #узлы

Вопрос:

Я пытаюсь создать простой односвязный список. Ранее я успешно делал это без ошибок, однако теперь я сталкиваюсь с ошибкой. Я подозреваю, что существует какая-то проблема с выделением памяти из-за if инструкции в строке 23.

Что я пробовал:

  1. Я использовал приведение типов во всех своих объявлениях, хотя в C. это не обязательно.

  2. Я удалил if инструкцию, и я все еще сталкивался с ошибками.

Вот мой код:

 #include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int value;
    struct Product *next;

} Product;

int main()
{
    int user_choice;
    Product *head;

    head = malloc(sizeof(Product));
    head->next = NULL;
    head->value = 5;

    printf("n Do you want to add a new node (0 for no, 1 for yes)? n");
    scanf("%d", amp;user_choice);

    if (user_choice == 1) // line 23
    {
        head->next = malloc(sizeof(Product));

        if (!head->next)
            printf("n Memory allocation failed! n");

        head->next->next = NULL; // 1st error 

        printf("n Enter a value: n");

        int value;
        scanf("%d", amp;value);

        head->next->value = value; // 2nd error
    }

    free(head);
    free(head->next);
}
  

Комментарии:

1. Что заставляет вас подозревать строку 23? Опубликуйте сообщение об ошибке, которое вы получаете.

2. @MarkBenningfield Потому что программа может не знать, выделять память или нет, но при дальнейшей проверке это была моя неправильная мысль. Все, что указано выше if инструкции, работает идеально. Вот сообщение об ошибке указатель на неполный тип класса не разрешен

3. Если ваш компилятор жалуется на неполный тип класса , то вы, должно быть, компилируете с помощью компилятора C или иным образом, как если бы ваш код был C . Похоже, что это не является основной причиной проблемы, о которой вы спрашиваете, но это может быть проблемой. C и C имеют общее подмножество, но ни один из них не является полностью совместимым с другим.

Ответ №1:

 typedef struct
{
} Product;
  

Объявляет псевдоним типа, вызываемый Product для неназванной структуры — однако вам нужна именованная структура для вашего прямого объявления struct Product *next; , иначе компилятор не сможет определить, к какому определению она принадлежит.

Самое простое решение — присвоить структуре имя:

 typedef struct Product
{
    int value;
    struct Product *next;
} Product;