указатель на неполный тип класса недопустим - односвязный список - PullRequest
1 голос
/ 14 апреля 2019

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

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

  1. Я использовал typecasting во всех моих объявлениях, хотя в 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", &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", &value);

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

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

1 Ответ

6 голосов
/ 14 апреля 2019
typedef struct
{
} Product;

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

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

typedef struct Product
{
    int value;
    struct Product *next;
} Product;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...