C语言删除链表元素的方法
A method to delete the elements in a linkedlist using C
所以我被要求做一个清空整个链表的方法。
这就是我现在拥有的,我不知道为什么它不想工作:
void deleteList(){
}
您的函数需要传递到列表的头部,即它可以操作的 struct node *head
。然后你可以使用它而不是 current
来跟踪当前的头部。
void deleteList(struct node *head){
struct node* next;
while (head!= NULL) {
next = head->next;
free(head);
head = next;
}
}
编辑:
既然列表头是一个全局变量,那么你会这样做:
struct node *head; // Initialized elsewhere
void deleteList(){
struct node* current = head;
struct node* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
}
您的函数一开始就不会将 "current" 分配给任何节点。因此,您的 while 循环永远不会运行,因为 "current" 实际上总是等于 NULL( 希望 ,实际上它是未定义的,可能会导致非常奇怪的行为)。循环总是被跳过。尝试将列表的第一个节点作为参数传递给您的函数:
void deleteList(struct node * start) {
//"start" points to the first node in the list, point "current" at it
struct node * current = start;
struct node * next;
while (current != NULL) {
next = current->next;
//what's this pop doing? It seems unnecessary to the logic here
pop(next);
//free "current" and then point "current" at "next"
free(current);
current = next;
}
}
这还允许您通过提供 "start" 您想要开始释放的节点来释放列表末尾的任意部分。它不必是第一个节点。
所以我被要求做一个清空整个链表的方法。
这就是我现在拥有的,我不知道为什么它不想工作:
void deleteList(){
}
您的函数需要传递到列表的头部,即它可以操作的 struct node *head
。然后你可以使用它而不是 current
来跟踪当前的头部。
void deleteList(struct node *head){
struct node* next;
while (head!= NULL) {
next = head->next;
free(head);
head = next;
}
}
编辑:
既然列表头是一个全局变量,那么你会这样做:
struct node *head; // Initialized elsewhere
void deleteList(){
struct node* current = head;
struct node* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
}
您的函数一开始就不会将 "current" 分配给任何节点。因此,您的 while 循环永远不会运行,因为 "current" 实际上总是等于 NULL( 希望 ,实际上它是未定义的,可能会导致非常奇怪的行为)。循环总是被跳过。尝试将列表的第一个节点作为参数传递给您的函数:
void deleteList(struct node * start) {
//"start" points to the first node in the list, point "current" at it
struct node * current = start;
struct node * next;
while (current != NULL) {
next = current->next;
//what's this pop doing? It seems unnecessary to the logic here
pop(next);
//free "current" and then point "current" at "next"
free(current);
current = next;
}
}
这还允许您通过提供 "start" 您想要开始释放的节点来释放列表末尾的任意部分。它不必是第一个节点。