Узел удаления связанного списка.Свободно (указатель) печатает 0 в следующем узле - PullRequest
0 голосов
/ 06 июня 2018

Ниже приведен узел удаления в коде списка ссылок, который принимает указатель головы и позицию для удаления в качестве аргументов (индекс позиции начинается с нуля в списке ссылок).И после удаления возвращает указатель на голову.

Node* delete(Node* head, int position) 
{
    Node *p = head;
    if(!position)
    {
        p = p->next;
    }
    else
    {
        while(position--)
        {
            if(!position) head->next = head->next->next; 
            head = head->next;
        }
    }
    free(head);
    return p; 
}

Предположим, список: 20-2-19-7-3-6.И позиция для удаления равна 2 (узел 19 для удаления, так как индекс начинается с нуля).

После удаления и печати, он говорит: 20-2-0-3-6. (Т.е. узел непосредственно следующийна один удаленный отпечаток 0)

Но если я уберу строку "free (head)", то она напечатает: 20-2-7-3-6 (правильно).

Пожалуйстапомогите и объясните, почему.

PS: при удалении головного или хвостового узла проблем не возникает.Но любой другой узел между ними показывает 0 в следующем узле.

1 Ответ

0 голосов
/ 06 июня 2018

Это пробный запуск кода:

20 --> 2 --> 19 --> 7 --> 3 --> 6
^
head

while(position--) // position == 2
{
    if(!position) // position == 1, condition is false
        head->next = head->next->next; 
    head = head->next;
}

20 --> 2 --> 19 --> 7 --> 3 --> 6
       ^
       head

while(position--) // position == 1
{
    if(!position) // position == 0, condition is true
        head->next = head->next->next;
    head = head->next;
}

            /-----\
20 --> 2 --/ 19 --> 7 --> 3 --> 6    // 2's next is pointing to 7 now
                    ^
                    head

Теперь будет выполнено free(head), которое удалит узел, содержащий номер 7.Теперь, когда вы печатаете, вы, вероятно, получите:

20 -> 2 -> (reference to deleted node) -> 3 -> 6

Я думаю, что это неопределенное поведение, когда вы ссылаетесь на удаленный узел, и он печатает 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...