过去几天我一直在学习我的c++技能。我在看我的数据结构书,然后我想为什么不实现双链表程序。我写了程序;令人惊讶的是,它也工作得很好,但是,我不确定我是否写对了。我不知道如何释放我分配的内存。请帮帮我,伙计们。
如果你们谁能解释一下这个"while(linkNode!=0)",我将非常感激。
#include<stdio.h>
#include<malloc.h>
struct node
{
int x;
struct node * next;
struct node * prev;
};
struct head
{
unsigned int count;
struct node * hd;
struct node * tl;
};
void main()
{
int i =0;
struct node * linkNode;
struct head *hdd;
hdd = (head *)malloc(sizeof(head));
linkNode = (node *) malloc(sizeof(node));
hdd->count = 1;
hdd->hd = linkNode;
linkNode->prev = 0;
linkNode->next = 0;
linkNode->x = 0;
for(;i<10;i++)
{
linkNode->next = (node *) malloc(sizeof(node));
linkNode->next->prev = linkNode;
linkNode = linkNode->next;
linkNode->next = 0;
linkNode->x = i;
hdd->count+=1;
hdd->tl = linkNode;
}
linkNode = hdd->hd;
printf("priniting in next directionn");
while(linkNode!=0)
{
printf("%dn",linkNode->x);
linkNode = linkNode->next;
}
linkNode = hdd->tl;
printf("priniting in prev directionn");
while(linkNode!=0)
{
printf("%dn",linkNode->x);
linkNode = linkNode->prev;
}
linkNode = hdd->hd;
while(linkNode!=0)
{
free(linkNode->prev);
linkNode = linkNode->next;
}
free(hdd);
}
你的链表看起来像这样:
+------+----+----+
| Head | hd | tl | ---------->--------
+------+----+----+
| ---->------ | NULL
| / | |
+------+-----+------+------+ +------+-----+------+------+
| Node | x=0 | next | prev | | Node | x=1 | next | prev |
+------+-----+------+------+ +------+-----+------+------+
| | |
NULL /
-----------------------<----------------------
(我已将其简化为两个节点)。
现在,我们可以写出这段代码的作用:
linkNode = hdd->hd;
while(linkNode!=0) {
free(linkNode->prev);
linkNode = linkNode->next;
}
-
linkNode = hdd->hd
使linkNode
指向第一个节点 -
(linkNode!=0)
是true(第一个节点不是NULL),所以我们进入while循环 -
free(linkNode->prev)
自hdd->hd->prev == NULL
之后调用free(NULL)
(您像这样显式地设置了第一个节点)。这很好,但是什么也做不了。 -
linkNode = linkNode->next
使linkNode
指向最后一个节点 -
linkNode!=0
仍然为真(最后一个节点也不是NULL),所以我们再次进行循环 -
free(linkNode->prev)
释放前一个节点(这是第一个节点) -
linkNode!=0
现在为假,因此循环终止。
linkNode = linkNode->next
离开linkNode == NULL
所以,我们释放了除最后一个节点外的所有节点。没有节点的prev
成员指向该节点,因此调用free(linkNode->prev)
永远不能释放它。但是,您可以通过hdd->tl
释放它。
您已经按照与链表尾部相反的顺序释放了分配给链表节点的内存。这一行就是这样做的。
free(linkNode->prev);
程序中存在内存泄漏。列表中的最后一个节点未被释放。
只包含
free(linkNode);
在释放硬盘之前。
说明:
while(linkNode!=0)
这是为了确保您正在解引用NULL
指针。因为解引用NULL指针可能导致undefined behaviours
.
这些是解引用操作
linkNode->x
linkNode->prev