Возврат и освобождение узла связанного списка

#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 должна только отсоединять узел от списка (т. Е. Подключать предыдущий узел к следующему узлу). Освобождение этого узла должно происходить вне функции. Другими словами, на самом деле вы должны делать именно то, что вас интересует («это будет освобождение вызывающего объекта, а не самой функции»).

2. удаление узла

3. @ryyker void deleteNode не возвращает узел

4.Ваш анализ верен. Вероятно, вы хотите removeNode просто разорвать его (но не free его). Вызывающий объект все еще может работать с [возвращенным] указателем. Когда вызывающий объект завершен, вызов (например) destroyNode может выполнить free узел и любой внутренний free (например free(node->string); free(node); )

5. Я согласен, это просто ленивая / ошибочная семантика из требований / комментариев. Как только removeNode (или любая другая функция) возвращается, она больше не может работать. Вам нужно спросить того, кто дал вам это назначение. Возврат указателя на узел, а затем освобождение его той же функцией, действительно кажется мне невозможным. И, как упоминали другие, для этой функции нет смысла освобождать узел, а затем возвращать недействительный указатель туда, где он был раньше. Возврат a bool , указывающего, был ли узел с этим key найден и удален или нет, имеет гораздо больше смысла.