Если я освобожу головной узел связанного списка, он просто удалит головной узел с другими узлами, все еще находящимися в памяти, или освободит весь список и как?Освобождение головного узла связанного списка
ответ
Ваш связанный список должен быть как:
head
+---+ +---+ +---+
| 1 |--->| 2 |--->| 3 |---+
+---+ +---+ +---+ |
null
head
узел хранит адрес кулака узла только я f вы делаете free(head)
, тогда он освободит память первого узла со значением 1
только и другие узлы все еще находятся в памяти и действительны для доступа к ним, но сначала вы должны сохранить адрес узла 2
, чтобы получить доступ к связанному списку (иначе у вас будет утечка памяти в вашем коде).
ли как:
new_head = head->next;
free(head);
После того, как вы освободить/свободный() память, его Неопределенное поведение, чтобы получить доступ, что нет (адрес становится недействительным).
Из комментариев:
Да, вам нужен цикл для свободного() памяти для всех узлов связанного списка, сделать что-то вроде этого:
while(head){ // while head not null new_head = head->next; // first save address of next free(head); // free first node head = new_head; // set head to next node, not yet free }
- comment- 2:
Если вы не удаляете/не освобождаете динамически выделенную память в своей программе, тогда она останется выделенной для вашего процесса до тех пор, пока он не завершится (помните, в C у нас нет сборщика мусора). Динамически выделяемая память имеет срок службы, пока ваша программа не завершится. Поэтому, если вы закончили работу с выделенной памятью, освободите ее явно.
Освобождение головного узла просто освобождает память, выделенную головному узлу. Остальные узлы списка будут сохранены. Затем вы должны указать голову на следующего члена списка. Для примера рассмотрим следующий единый связанный список,
A -> B -> C -> D -> Null
После освобождения узла головки и перемещения головки к узлу В, связанный список будет выглядеть как это
B -> C -> D -> Null
Освобождение головного узла списка освобождает только этот узел, не остальная часть списка.
Это основное отличие между массивами и связанными списками - память разделяется. Вот иллюстрация:
struct testnode {
int a;
int b;
struct testnode * next;
};
В массиве памяти может выглядеть следующим образом:
struct testnode test[3];
0x............0000 &test[0] // on a typical computer
0x............0020 &test[1]
0x............0040 &test[2]
Обратите внимание, как элементы в массиве все разложено прямо рядом друг с другом? Освобождение теста будет бесплатным, а последующая памяти, только один звонок должен освободить всю память.
В связанном списке, память может выглядеть следующим образом:
struct testnode * head;
// after insertions
0x............0000 head
0x............634f head->next
0x............114d head->next->next
Обратите внимание, как память несортированный (хотя это не всегда может быть что из строя). И высвобождение head
освободит только head
узел, оставив остальную память нетронутой.
спасибо @Taylor Flores –
Нет, когда вы освобождаете головной узел связанного списка, вы отмечаете только память, которая используется как «свободная для использования». Таким образом, другие узлы в памяти по-прежнему будут помечены как «в использовании».
Технически вы все еще можете использовать свободную память, но это неопределенное поведение, поэтому нет гарантий, что данные (включая указатели) по-прежнему правильны для использования.
Если вы хотите удалить все узлы из памяти, вы должны сделать это рекурсивно (с указатель точки зрения).
- 1. Освобождение связанного списка в C
- 2. Удаление головного узла и среднего рекурсивного списка
- 3. Создание узла связанного списка
- 4. Размер узла связанного списка
- 5. освобождение общего связанного списка в C
- 6. Освобождение памяти после удаления связанного списка
- 7. Освобождение одного связанного списка в c
- 8. Освобождение и удаление дубликатов из связанного списка?
- 9. Удаление узла из связанного списка
- 10. Удаление узла из связанного списка
- 11. Удаление единственного узла связанного списка
- 12. Удаление узла из связанного списка
- 13. Почему код связанного списка создает ошибку сегментации при удалении головного узла?
- 14. Связанный элемент головного списка
- 15. Освобождение связанного объекта
- 16. Освобождение узла Struct
- 17. Добавление головного узла в односвязный список дает ошибку ошибки сегментации
- 18. Удаление узла из дважды связанного списка И освобождение его места, а также
- 19. Добавление узла в конец связанного списка - C++
- 20. Удаление узла из связанного списка в Java
- 21. Добавить проблемы после узла связанного списка delete
- 22. Удаление узла из связанного списка указателя
- 23. Удаление узла из связанного списка в C
- 24. Вставка нового узла в хвост связанного списка
- 25. Вставка узла в конец связанного списка
- 26. Удаление узла из концов связанного списка
- 27. Удаление узла из дважды связанного списка
- 28. Псевдокод для удаления узла связанного списка
- 29. Помещение узла связанного списка в алфавитном порядке
- 30. Поиск строки Длина одного узла связанного списка
поэтому используйте цикл и удалите узел один за другим - это единственный выбор, который у меня есть или есть способ удалить список за один раз. –
@System_Coder ok вы хотите удалить полный список, да вам нужен цикл для свободной() памяти для всех узлов –
Grijesh Chauhan здесь, в комментарии Dinesh говорит, что если я позвоню бесплатно (глава), то весь связанный список будет удален , –