У вас есть возможность вернуть новую голову списка по возвращаемому значению. Если вы вставляете один узел, вам нужно выделить память для одного узла. Не забывайте инициализации члена prev
первого узла и элемента link
последнего узла с NULL
:
node* insert(char* str, node* head)
{
node* new_node = malloc(sizeof(struct node));
assert(new_node != NULL);
new_node->value = strdup(str);
new_node->link = NULL; // successor of new node is NULL
if (head == NULL)
{
new_node->pev = NULL; // prdecessor of first node is NULL
head = new_node;
return new_node; // head was NULL, return new head
}
node *lastNode = head; // go to last node of list
while (head->link != NULL)
lastNode = lastNode->link; // step one forward
lastNode->link = new_node; // successor of last node is new node
new_node->prev = lastNode; // predecesor of new node is last node
return head;
}
-
node *head = NULL;
head = insert("abc", head);
head = insert("def", head);
Другим решением было бы использовать для входных и выходных параметра Я для параметра Я head
в функции insert
:
void insert(char* str, node** head)
// ^^ in and output parameter
{
node* new_node = malloc(sizeof(struct node));
assert(new_node != NULL);
new_node->value = strdup(str);
new_node->link = NULL; // successor of new node is NULL
node* prev = NULL;
node* act = *head;
while (act != NULL) // go to last node in list
{
prev = act;
act = act->link; // step one forward
}
new_node->prev = prev; // predecessor of new node is last node or NULL
if (prev == NULL)
*head = new_node; // new node is the first node in list,
// write the new node back to head
else
prev->link = new_node; // successor of last node is new node
}
-
node *head = NULL;
insert("abc", &head);
insert("def", &head);
«Это работает?» Проверьте это, и вы узнаете. Не так просто увидеть, работает ли это, просто глядя на код - если вы не настоящий эксперт. – Ian
Это еще не весь код. Вы единственный, у кого достаточно кода, чтобы узнать, работает ли он или нет. – e0k
Обратите внимание, что 'head = head-> link;' изменяет значение 'head' в области действия функции, но не за ее пределами. Функции работают над копиями аргументов. Чтобы решить эту проблему, передайте 'head' указателем, даже если он уже является указателем. Попробуйте 'void insert (char * str, node ** head)' и 'if (* head == NULL) ...' – francis