#c #nodes
#c #узлы
Вопрос:
Я пытаюсь создать простой односвязный список. Ранее я успешно делал это без ошибок, однако теперь я сталкиваюсь с ошибкой. Я подозреваю, что существует какая-то проблема с выделением памяти из-за if
инструкции в строке 23.
Что я пробовал:
- Я использовал приведение типов во всех своих объявлениях, хотя в C. это не обязательно.
- Я удалил
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;