Метод pop для связанного списка ведет себя неожиданно - PullRequest
1 голос
/ 06 апреля 2020

У меня есть два разных связанных списка, и я пытаюсь извлечь один узел из первого связанного списка во второй связанный список. Моя цель при вызове функции pop (pop(Node * head)) - обновить новый заголовок и вернуться к выделенному узлу. Тем не менее, происходит то, что он превращается в извлеченный узел, а переданный Node * head указывает на вытолкнутый элемент. Поэтому я не могу продолжить. В чем моя проблема с этой функцией? Я, наверное, запутался с указателями

Node * pop(Node * head)
{
    Node * temp = head;
    long val = temp -> value; //store the value before deallocating

    head = head -> next;
    free(temp);
    return createNode(val);
}

//Code snippet where I call the pop function
if (currNode == NULL) {
                headSublistPointers -> node = pop(tmpHeadOrigArr);
            } else {
                while (currNode -> next != NULL) {
                    currNode = currNode -> next; //go until the end of the linked list
                }
                currNode -> next = pop(tmpHeadOrigArr);
            }

1 Ответ

0 голосов
/ 06 апреля 2020

Эта функция

Node * pop(Node * head)
{
    Node * temp = head;
    long val = temp -> value; //store the value before deallocating

    head = head -> next;
    free(temp);
    return createNode(val);
}

не имеет смысла.

Для начала голова должна передаваться по ссылке

Node * pop(Node **head);

и, во-вторых, вместо освобождения вытолкнутого узел, вы можете просто вернуть его setiing его член данных рядом с NULL. Также в общем случае головной узел может быть равен NULL.

Функция может выглядеть как

Node * pop( Node **head ) 
{
    Node *current = *head;

    if ( *head != NULL )
    {
        *head = ( *head )->next;
        current->next = NULL;
    }

    return current;
}
...