Проблема в том, что в первом коде insert
получает копию указателя main
head
и изменяет эту копию, заставляя ее указывать на некоторую вновь выделенную память. Эта модификация никогда не распространяется обратно на main
.
. Чтобы ее распространить, используйте указатель на указатель:
void insert(struct node **head) {
struct node *last, *temp;
*head = (struct node *)malloc(sizeof(struct node));
printf("Input an integer: ");
scanf("%d", &(*head)->data);
(*head)->link = NULL;
last = *head;
{
int n = 3;
while(n>0){
temp = (struct node *)malloc(sizeof(struct node));
printf("Input an integer: ");
scanf("%d", &temp->data);
temp->link = NULL;
last->link = temp;
last = temp;
n--;
}
}
return;
}
, а затем, в main
, назовите его так:
insert(&head);
В качестве альтернативы, вы могли бы заставить insert
взять указатель, но также вернуть указатель (т. Е. Новую голову):
struct node* insert(struct node *head) { ... }
Одна проблема, что этоAPI в том, что он довольно подвержен ошибкам: очень просто вызвать insert()
и забыть разобраться с его возвращаемым значением.