我正在编写从单链表中删除节点的常用方法,但我不确定我删除它们的方式(通过使用FREE())是否正确。我想真正删除节点,释放内存。我已经提供了Node的结构定义以及如何创建Node结构。
我知道在Java中任何时候没有指向数据,它是自动清理的。我想对于C,我必须用free,但我用对了吗?例如下面,当我"释放"电流时,我能让电流引用其他东西吗?最好的方法是什么?
谢谢,我希望我的问题是清楚的!typedef struct Node {
int data;
struct Node *next;
} Node;
struct Node* newNode(int value) {
struct Node* node = (Node *)malloc(sizeof(struct Node));
if (node == NULL) {
// malloc fails. deal with it.
} else {
node->data = value;
node->next = NULL;
}
return node;
}
void delete(int value, struct node *head) {
struct Node* current = head;
struct Node* previous = NULL;
while (current != NULL) {
if (current->data == value) {
if (previous == NULL) {
current = current->next;
free(head);
} else {
previous->next = current->next;
free(current);
current = previous->next;
}
} else {
previous = current;
current = current->next;
}
}
}
正确。当您使用free
并提供一个指针时,指针当前所指向的数据将从内存中释放。指针本身存储在其他地方,可以用来指向不同的数据后"释放"。在删除非头节点(previous->next = current->next
和current = previous->next
)时,在上一个节点和下一个节点之间创建链接是正确的。
我建议您的代码的一个补充是,在释放head
之后,您应该将头部指针重新分配给新的头部帖子删除,在这种情况下,这将是当前的。
希望这对使用free()
命令有帮助
struct Node
{
int data;
struct Node *next;
}
Node* Delete(Node *head, int position)
{
Node *temp1 = head;
if(position==0){
head = temp1->next;
free(temp1);
return head;
}
Node *temp2;
while(position>1){
temp1 = temp1->next;
position--;
}
temp2= temp1->next;
temp1->next = temp2->next;
free(temp2);
return head;
}