【发布时间】:2017-10-06 19:35:43
【问题描述】:
我正在阅读一本教科书,遇到了以下从链表中删除元素的函数。 CELL 类型定义如下;
typedef struct CELL CELL;
struct CELL {
int element;
CELL* next;
};
void delete(int x, CELL** pL) {
if ((*pL) != NULL) {
if (x == (*pL)->element)
(*pL) = (*pL)->next;
else
delete(x, &((*pL)->next));
}
}
现在假设我有一个从 5 开始的包含以下元素的链表;
5->10->3->21->15->7
现在假设我删除元素 10。我的问题是当 delete 函数返回时包含 10 的 CELL 会发生什么,因为这个 CELL 没有被引用?不是还在占内存吗?
【问题讨论】:
-
通过代码获取调试器步骤,并检查变量。
-
无关,该功能是原则的典范:“仅仅因为你可以并不意味着你应该。”该算法很容易移植到迭代解决方案。可能用作数据结构课程/课程的递归解决方案的一部分,它可能在那里达到其目的,但在实践中避免它。
-
是的,它仍然在占用空间,虽然不清楚元素是如何分配的。最好让
delete函数与内存管理无关,并返回指向已删除的CELL的指针(如果没有删除单元格,则返回NULL)并让调用者释放它。你可以有一个包装函数来释放元素。这个函数的另一个奇怪之处是使用尾递归而不是迭代。如果编译器没有对其进行优化,如果列表很长,您可能会出现堆栈溢出。
标签: c pointers memory linked-list