Для начала код, который вы указали, недействителен C-кодом. Вы используете элементы C++. Таким образом, программа даже не будет компилироваться как программа C.
Поскольку узел start
, который изначально установлен в NULL
, может быть изменен функцией, которую вы должны передать ей по ссылке. В противном случае параметр функции linkedlist
является локальной переменной функции, которая будет изменена в функции и, наконец, будет уничтожена после выхода из функции. Поэтому исходный указатель start
сам по себе не изменится.
Кроме того, это еще блок кода
else {
new_element->next = (linkedlist)->next;
(linkedlist)->next = new_element;
}
неправильно. Этот кодовый блок не вставляет новый узел в начало списка. Он вставляет новый узел после первого уже существующего узла.
Учтите, что имя функции append
не подходит для установки узла в начале списка. Лучше назвать его как insert
. Функция может выглядеть следующим образом
int insert(struct node **linkedlist, int data)
{
struct node *new_element = malloc(sizeof(struct node));
int success = new_element != NULL;
if (success)
{
new_element->data = data;
new_element->next = *linkedlist;
*linkedlist = new_element;
}
return success;
}
Если вы действительно нужен функция, которая присоединяет узлы в список, то он может выглядеть следующим образом
int append(struct node **linkedlist, int data)
{
struct node *new_element = malloc(sizeof(struct node));
int success = new_element != NULL;
if (success)
{
new_element->data = data;
new_element->next = NULL;
while (*linkedlist != NULL) linkedlist = &(*linkedlist)->next;
*linkedlist = new_element;
}
return success;
}
Вот демонстративной программа
#include <stdlib.h>
#include <stdio.h>
struct node
{
int data;
struct node* next;
} *start = NULL;
int insert(struct node **linkedlist, int data)
{
struct node *new_element = malloc(sizeof(struct node));
int success = new_element != NULL;
if (success)
{
new_element->data = data;
new_element->next = *linkedlist;
*linkedlist = new_element;
}
return success;
}
int append(struct node **linkedlist, int data)
{
struct node *new_element = malloc(sizeof(struct node));
int success = new_element != NULL;
if (success)
{
new_element->data = data;
new_element->next = NULL;
while (*linkedlist != NULL) linkedlist = &(*linkedlist)->next;
*linkedlist = new_element;
}
return success;
}
void printList(struct node* linkedlist)
{
if (linkedlist == NULL)
{
puts("Linked list is empty");
}
else
{
for (struct node *current = linkedlist; current != NULL; current = current->next)
{
printf("%d ", current->data);
}
printf("\n");
}
}
int main(void)
{
const int N = 10;
for (int i = 1; i <= N; i++)
{
if (i % 2 == 0) append(&start, i);
else insert(&start, i);
}
printList(start);
return 0;
}
Его выпуск -
9 7 5 3 1 2 4 6 8 10
И не используйте компилятор C++ для компиляции C. – wildplasser
@nobar: строка 'void append (node * linkedlist, int data) {' не сможет скомпилироваться в C, поскольку 'node' не является типом (нет typedef). Это всего лишь одно из отличий между C и (подмножество) C++ – wildplasser
. @ KostasRim i пока не подтвердил это, я сделал этот метод раньше, я не знал о том, что значение передается как копия, следовательно, upvote .Плюс, я буду висеть на немного больше, чтобы увидеть еще несколько ответов :) –