#c #memory-management #linked-list #singly-linked-list
#c #управление памятью #связанный список #single-linked-list
Вопрос:
Я не уверен, возможно ли то, о чем меня просят. Допустим, у меня есть следующая структура
typedef struct node {
int key;
struct node* next;
} sNode;
Я заполняю связанный список этими узлами, и теперь меня просят реализовать следующую функцию
sNode* removeNode(int key); // removes the node with the matching key, returns it and finally deallocates it
Я могу получить доступ к заголовку и текущему узлу из переменных
sNode *Head, sNode *Current;
Моя проблема не в том, чтобы найти узел и удалить его, я просто не понимаю, как я должен сначала вернуть узел, а затем освободить его в той же функции.
Единственный способ, о котором я могу думать, — это вызвать free(removeNode(key))
вместо removeNode(key)
, но тогда это будет освобождение вызывающего, а не самой функции, нет?
Я что-то упускаю или это так невозможно, как мне кажется?
Комментарии:
1. Я думаю, что эта функция
removeNode
должна только отсоединять узел от списка (т. Е. Подключать предыдущий узел к следующему узлу). Освобождение этого узла должно происходить вне функции. Другими словами, на самом деле вы должны делать именно то, что вас интересует («это будет освобождение вызывающего объекта, а не самой функции»).3. @ryyker void deleteNode не возвращает узел
4.Ваш анализ верен. Вероятно, вы хотите
removeNode
просто разорвать его (но неfree
его). Вызывающий объект все еще может работать с [возвращенным] указателем. Когда вызывающий объект завершен, вызов (например)destroyNode
может выполнитьfree
узел и любой внутреннийfree
(напримерfree(node->string); free(node);
)5. Я согласен, это просто ленивая / ошибочная семантика из требований / комментариев. Как только
removeNode
(или любая другая функция) возвращается, она больше не может работать. Вам нужно спросить того, кто дал вам это назначение. Возврат указателя на узел, а затем освобождение его той же функцией, действительно кажется мне невозможным. И, как упоминали другие, для этой функции нет смысла освобождать узел, а затем возвращать недействительный указатель туда, где он был раньше. Возврат abool
, указывающего, был ли узел с этимkey
найден и удален или нет, имеет гораздо больше смысла.