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

#c #nodes

#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;