这是一个有效的LinkedList析构函数吗?我仍然对他们感到困惑。
我想确保我正确理解这一点。
LinkedList::~LinkedList()
{
ListNode *ptr;
for (ptr = head; head; ptr = head)
{
head = head->next
delete ptr;
}
}
因此,在循环开始时,指针ptr被设置为保存head的地址,即列表中的第一个节点。然后将head设置为下一个项目,该项目将在第一次删除后成为列表的开头。 ptr被删除,第一个节点也是如此。在循环的第一次迭代中,指针再次设置为head。
关注我的事情是到达最后一个节点。条件“头;”应检查它是否为空,但我不确定它是否会起作用。
任何帮助表示感谢。
答案 0 :(得分:15)
为什么不做得更简单 - 使用优雅的while
循环而不是试图仔细分析过度编译的for
循环是否正确?
ListNode* current = head;
while( current != 0 ) {
ListNode* next = current->next;
delete current;
current = next;
}
head = 0;
答案 1 :(得分:5)
您可以通过调试器运行它,或者您可以通过头骨内的那些湿软件运行它 - 两者都会向您显示它工作正常。例如,让我们从列表开始:
head(47) -> [47]single_node -> [NULL]end-of-list.
通过语句运行该列表:
ptr = head
将ptr
设置为47。head
非零,因此请输入循环。head = head->next
将head
设置为NULL。delete ptr
将删除single_node
。ptr = head
将ptr
设置为NULL。head
现在为NULL(0),因此退出循环。你去了,你删除了列表中唯一的条目,head
现在设置为NULL。这就是你需要做的一切。
你可以用更长的列表或空列表做类似的事情,你会发现它仍然没问题(单元素列表和50元素列表之间没有真正的区别)。
顺便说一句,我并不是把指针视为布尔人的忠实粉丝 - 我宁愿把它写成像:
for (ptr = head; head != NULL; ptr = head)
在我看来,它使代码读得更好,你并没有真正牺牲任何性能(除非你有一个脑死亡的编译器)。但这是一个品味问题。
重新评论:
关注我的事情是到达最后一个节点。条件“头;”应检查它是否为空,但我不确定它是否会起作用。
它会起作用。零值将被视为假,因此你会发现你永远不会取消引用head-> next当head为NULL时,因为你将在该点之前退出循环体(如果列表是空)。
任何其他指针值都将被视为true,您将进入或继续循环体。
答案 2 :(得分:3)
条件“头;”应检查它是否为空,但我不确定它是否会起作用。
是的,“head”本身与“head!= null”相同 - 但是为什么使用无意义的打字快捷方式,即使你发现它令人困惑?它只有6次击键(并产生相同的机器代码),所以选择长形式。
此外,您的代码比必要的要复杂一点,因为您使用的是for()
构造。为什么不使用while()
?你的代码会更清晰。
最后,我意识到你这是一个学习练习,但要记住列表<>在标准库中---链接列表是官方的“解决问题”。
答案 3 :(得分:2)
测试好了
类列表的析构函数
List::~List()
{
Node *n = this->front, *current = NULL; //initialization part
while(n) //start cleanup of nodes of the list
{
current = n;
n=n->next;
delete(current);
}
front = end = NULL;
}
答案 4 :(得分:0)
您的代码可能是正确的,您应该尝试使用例如valgrind看看它说的是什么。但是,我会这样写:
for (ListNode *current = head, *next; current; current = next) {
next = current->next;
free(current);
}
答案 5 :(得分:0)
这是使用Linked-List的析构函数释放/删除内存的更好方法。
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)