使用函数释放带有双指针的链表
Using a function to free a linked list with double pointer
我很难用一个函数删除 linked 中的所有成员。如果我像你在下面看到的那样分解它,它工作正常,但这似乎非常低效并且想找出正确的方法来做到这一点。为了释放所有节点,我需要有一个函数来首先释放除头部以外的所有节点,然后有一个释放头部的函数 link。这似乎很容易做到,但我遇到了麻烦。
感谢您的帮助!
int main() {
struct node *head = NULL;
createList(&head);
//do stuff with list
freeListMembers(head);
freeListHead(&head);
return 0;
}
int createList(struct node **head) {
//create list
return 0;
}
void freeListMembers(struct node *head){
while(head->next != NULL){
head->next = NULL;
free(head->next);
}
return;
}
void freeListHead(struct node **head) {
*head = NULL;
free(*head);
return;
}
这是我想工作但没有工作的代码。我看到的问题是“*head->next;”的错误它说的是 "expression must have pointer to struct or union type"
int main() {
struct node *head = NULL;
createList(&head);
//do stuff with list
freeAllListMembers(&head);
return 0;
}
int createList(struct node **head) {
//create list
return 0;
}
void freeAllListMembers(struct node **head){
while (head != NULL) {
struct node *temp = *head->next;
free(*head);
*head = temp ;
}
return;
}
来自您的代码:
void freeListMembers(struct node *head){
while(head->next != NULL){
head->next = NULL;
free(head->next);
}
return;
}
这是释放 NULL,不是你的节点*。
释放列表就像使用指向下一个节点的临时指针一样简单。
while (head) {
node* next = head->next;
free(head);
head = next;
}
来自您的编辑:
void freeAllListMembers(struct node **head){
while (head != NULL) {
struct node *temp = *head->next;
free(*head);
*head = temp ;
}
return;
}
这里有几个错误。应该是 while (*head != NULL)
和 (*head)->next
。第一个是逻辑错误,因为 head 总是非 NULL,第二个是语法错误,因为在访问下一个指针之前需要取消引用 head 指针。
这行得通。您只需将 head 的 next 设置为 null 并释放 head 。现在我们不能移动到第二个 element.So 我们将无法释放 nodes.Also 检查基本条件。希望对你有帮助
void freeListmembers(node *head){
node *temp=head;
if(head==NULL)//Base condition
return;
while(head->next!=NULL){
temp=head;//Moved temp to head. we will move head to next and free the previous node
head=head->next;
free(temp);
}
free(head);
return;
}
我很难用一个函数删除 linked 中的所有成员。如果我像你在下面看到的那样分解它,它工作正常,但这似乎非常低效并且想找出正确的方法来做到这一点。为了释放所有节点,我需要有一个函数来首先释放除头部以外的所有节点,然后有一个释放头部的函数 link。这似乎很容易做到,但我遇到了麻烦。
感谢您的帮助!
int main() {
struct node *head = NULL;
createList(&head);
//do stuff with list
freeListMembers(head);
freeListHead(&head);
return 0;
}
int createList(struct node **head) {
//create list
return 0;
}
void freeListMembers(struct node *head){
while(head->next != NULL){
head->next = NULL;
free(head->next);
}
return;
}
void freeListHead(struct node **head) {
*head = NULL;
free(*head);
return;
}
这是我想工作但没有工作的代码。我看到的问题是“*head->next;”的错误它说的是 "expression must have pointer to struct or union type"
int main() {
struct node *head = NULL;
createList(&head);
//do stuff with list
freeAllListMembers(&head);
return 0;
}
int createList(struct node **head) {
//create list
return 0;
}
void freeAllListMembers(struct node **head){
while (head != NULL) {
struct node *temp = *head->next;
free(*head);
*head = temp ;
}
return;
}
来自您的代码:
void freeListMembers(struct node *head){
while(head->next != NULL){
head->next = NULL;
free(head->next);
}
return;
}
这是释放 NULL,不是你的节点*。
释放列表就像使用指向下一个节点的临时指针一样简单。
while (head) {
node* next = head->next;
free(head);
head = next;
}
来自您的编辑:
void freeAllListMembers(struct node **head){
while (head != NULL) {
struct node *temp = *head->next;
free(*head);
*head = temp ;
}
return;
}
这里有几个错误。应该是 while (*head != NULL)
和 (*head)->next
。第一个是逻辑错误,因为 head 总是非 NULL,第二个是语法错误,因为在访问下一个指针之前需要取消引用 head 指针。
这行得通。您只需将 head 的 next 设置为 null 并释放 head 。现在我们不能移动到第二个 element.So 我们将无法释放 nodes.Also 检查基本条件。希望对你有帮助
void freeListmembers(node *head){
node *temp=head;
if(head==NULL)//Base condition
return;
while(head->next!=NULL){
temp=head;//Moved temp to head. we will move head to next and free the previous node
head=head->next;
free(temp);
}
free(head);
return;
}