Для удаления узла в связанном списке, если я использую memmove() (в C), будет ли это более эффективно?

В каждом примере, который я встречал в Интернете об удалении узла в связанном списке, они используют этот метод для удаления первого узла:

Algorithm to delete first node of Singly Linked List
%%Input:  head of the linked list
Begin:
    If (head != NULL) then
        toDelete ← head
        head ← head.next
        unalloc (toDelete)
    End if
End

В этом коде они освобождают область памяти после того, как они удалили 1-й узел из списка. Но я использую memove() для удаления 1-го узла связанного списка.

...
if (key == 1){ 
    memmove(head, head->next, sizeof(node));
    return;
}
...

Итак, когда я использую memmove(), он автоматически освобождает область памяти?? И мой код более эффективен??


person 0x30c4    schedule 01.11.2020    source источник
comment
Нет, это не так.   -  person mvp    schedule 01.11.2020
comment
Вы только что создали утечку памяти, переместив данные второго узла на адрес первого. В этом случае вы потеряли адрес 1-го узла. Вызов free на head теперь удалит исходный 2-й узел без возможности освободить то, что было исходным head узлом.   -  person David C. Rankin    schedule 01.11.2020
comment
Итак, могу ли я сказать, что есть только один способ удалить узел   -  person 0x30c4    schedule 01.11.2020
comment
Нет, есть несколько способов сделать это, но все они включают в себя освобождение удаляемого узла, см. функцию del_node() здесь Односвязный список (только узел, без оболочки) Почему лучше использовать как адрес указателя, так и указатель, см. Линус о понимании указателей   -  person David C. Rankin    schedule 01.11.2020
comment
Исходный 1-й узел по-прежнему возглавляет список, но теперь содержит данные, которые делал 2-й узел (его исходные данные перезаписываются). Старый 2-й узел не был освобожден, но указатель на него в 1-м исчез, потому что ваш 1-й узел теперь вместо этого указывает на (исходный) 3-й узел. Таким образом, происходит утечка памяти из-за того, что старый 2-й узел не освобождается. И вряд ли быстрее.   -  person Dmitri    schedule 01.11.2020


Ответы (1)


В вашем коде head есть указатель, который является скаляром, поэтому использование memmove не будет быстрее, чем простое присваивание. Функция memmove может быть полезна при копировании больших объектов.

person August Karlstrom    schedule 01.11.2020