gpt4 book ai didi

c - 在我的单链表实现中,为什么即使我为要释放的节点分配了内存,指向节点的指针也不为空?

转载 作者:行者123 更新时间:2023-11-30 19:03:19 24 4
gpt4 key购买 nike

使用delete_SLL函数我想删除这个单链表的头(head = 4)。虽然我得到了正确的输出,但保存头部值的 var struct Node* "temp"不是 NULL。 free 函数不喜欢变量“temp”,它有什么特点?当将节点温度设置为等于列表头时,节点温度是否未进行 Malloc?

Source:Deleting a Node

代码:

#include <stdio.h>
#include <stdlib.h>
struct Node{
int item;
struct Node* next;
};

struct List{
struct Node* head;
struct Node* tail;
};

int SLL_empty(struct List* lst){
return lst->head == NULL ;
}

//newLst work
struct List newLst(){
struct List lst;
lst.head = NULL;
lst.tail = NULL;
return lst;
}


//Inserts a node to the front of the list[WORKS]
void insert_SLL(struct List* lst, int x){
struct Node* nde = (struct Node*)malloc(sizeof(struct Node));
nde->next = lst->head;
nde->item = x;
if (SLL_empty(lst))
lst->tail=nde;
lst->head = nde;
}


//Deletes a given Node
void delete_SLL(struct List* lst, int x){
struct Node* temp = (struct Node*)malloc(sizeof(struct Node));;
temp = lst->head;
struct Node* prev = NULL;`enter code here`

//If the head has the key
if (temp != NULL && temp->item == x){
lst->head = temp->next;
temp->next = NULL;
free(temp);
}

// stops once the key is found
while(temp != NULL && temp->item != x){
prev = temp;
temp= temp->next;
}

//If not in list
if (temp == NULL) return;

//If middle
if (temp != NULL && temp->item == x){
prev->next = temp->next;
temp->next = NULL;
}

//if at the end
if (temp != NULL && temp->item == lst->tail->item){
lst->tail= prev;
prev->next = NULL;
}
free(temp);
}

int SLL_pop(struct List *list){
struct Node* nde = list->head;
int item = nde->item;
list->head = nde->next;
free(nde);
if (SLL_empty(list))
list->tail = NULL;
return item;
}

int main(int argc, const char * argv[]) {
int i;
struct List list = newLst();
for (i = 0; i < 5; ++i)
insert_SLL(&list, i);
// printf("The length of the linkedLst is: %d\n",SLL_length(&list));

delete_SLL(&list, 4);
while ( list.head != NULL )
printf("Node: %d\n", SLL_pop(&list));

return 0;
}

最佳答案

free()的主要目的是要求操作系统将分配的内存拿回给系统。您可能无法“看到”它,但如果您随后尝试访问“临时”的任何元素,您应该会收到错误。

而“temp”在程序中只是一个变量。由于值传递的意义,C 不需要也不能将给定的指针更改为 NULL。程序员的工作就是记住这个指针不再有效。
或者您可以在每次释放指针时手动将其设置为 NULL。

关于c - 在我的单链表实现中,为什么即使我为要释放的节点分配了内存,指向节点的指针也不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54086319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com