Хорошо, у вас есть ряд проблем, и ваш компилятор должен сообщить вам точную строку, на которой они находятся. Для начала вам не хватает struct List
в вашем определении List
, например
typedef struct List {
int num;
struct List *next;
} List;
Затем вам нужно исправить каждое местоположение, которое вы используете, используя list
вместо List
в качестве типа, например
List *insert (List *head, int num)
и
List *create_new_list (List *new_list)
и
List *head = malloc(sizeof *head);
После внесения изменений у вас будет ( примечание: У меня нет scanf_s
, поэтому ниже используется scanf
):
#include <stdio.h>
#include <stdlib.h>
typedef struct List {
int num;
struct List *next;
} List;
List *insert (List *head, int num)
{
List *temp = malloc (sizeof *temp);
List *temp_head = head;
temp->num = num;
temp->next = NULL;
if (head == NULL)
head = temp;
else {
while (temp_head->next != NULL)
temp_head = temp_head->next;
temp_head->next = temp;
}
return head;
}
List *create_new_list (List *new_list)
{
int number;
printf("Enter numbers, to exit enter negative number\n");
scanf ("%d", &number);
if (number <= 0)
{
return NULL;
}
new_list->num = number;
new_list->next = NULL;
scanf ("%d", &number);
while (number >= 0)
{
new_list=insert(new_list, number);
scanf("%d", &number);
}
return new_list;
}
void prnList (List *head)
{
for (; head; head = head->next)
printf (" %d", head->num);
putchar ('\n');
}
int main()
{
List *head = malloc(sizeof *head);
head=create_new_list(head);
prnList (head);
}
( примечание: Я добавил функцию prnList()
)
Пример использования / Выход
$ ./bin/ll_scanf
Enter numbers, to exit enter negative number
1 2 3 4 5 -1
1 2 3 4 5
Альтернатива - Избегайте выделения для head
Вы можете просто использовать head
в main()
с автоматическим c хранилищем продолжительность, а не распределение. Например, вы можете сделать:
int main()
{
List head = { .num = 0 };
create_new_list(&head);
prnList (&head);
}
Это просто освобождает вас от необходимости позже free(head)
и в противном случае и может быть передано любой функции, которая в нем нуждается, как если бы она была выделена. Примечание: вы не назначаете возврат из create_new_list(&head);
, если вы выбираете этот маршрут, поскольку head
выше является экземпляром структуры, а не указателем на List
.
Посмотрите Дайте мне знать, если у вас возникнут вопросы.
Также обратите внимание: '*'
идет с именем переменной, а не с типом (обычно). Зачем? Поскольку:
List* a, b, c;
НЕ объявляет три указателя на List
, вместо этого объявляется один указатель на List
(a
) и два экземпляра struct List
(b, c
). Использование:
List *a, b, c;
проясняет это.