C 删除链表中的节点
大多数代码都可以工作,但当我试图删除列表中的最后一个元素并打印它时,我在它的位置上看到一些垃圾数据,我在这里做错了什么?有人能指出我的错误吗C 删除链表中的节点,c,linked-list,C,Linked List,大多数代码都可以工作,但当我试图删除列表中的最后一个元素并打印它时,我在它的位置上看到一些垃圾数据,我在这里做错了什么?有人能指出我的错误吗 void DeleteClient2(struct client *temp,struct client **head) { struct client *prev=*head; struct client *current = *head; struct item *currentitem = (*head)->item_dat
void DeleteClient2(struct client *temp,struct client **head)
{ struct client *prev=*head;
struct client *current = *head;
struct item *currentitem = (*head)->item_data,*save;
if(temp== *head)
{
while(currentitem != NULL)
{
save = currentitem;
currentitem = currentitem ->next;
free(save);
}
free(temp);
temp->item_data = NULL;
(*head) = (*head)->next;
}
else
if(temp->next == NULL)
{
while(currentitem != NULL)
{
save = currentitem;
currentitem = currentitem ->next;
free(save);
}
temp->item_data = NULL;
free(temp);
}
else
if(temp != *head && temp->next != NULL)
{
while(prev->next != temp)
{
prev=prev->next;
}
prev->next = temp->next;
while(currentitem != NULL)
{
save = currentitem;
currentitem = currentitem ->next;
free(save);
}
temp->item_data = NULL;
free(temp);
temp=temp->next;
}
}
代码:
是未定义的行为,一旦释放节点,就无法访问它,这样做是非法的 这里检查*head==temp,如果是,则释放temp,即*head,因为它们相等,您只是验证了它,然后说(*head)=(*head)->下一步;最有可能的是哪一种情况
if(temp== *head)
{
while(currentitem != NULL)
{
save = currentitem;
currentitem = currentitem ->next;
free(save);
}
free(temp);
temp->item_data = NULL;
(*head) = (*head)->next;
}
同样的混乱在这里
temp->item_data = NULL;
free(temp);
temp=temp->next;
首先正确缩进您的代码。那么我应该如何链接上一个节点和下一个节点?@user3209183保留保存上一个地址我的代码中可能有一些错误,但您可以尝试这个想法(我所做的更改
temp->item_data = NULL;
free(temp);
temp=temp->next;
void DeleteClient2(struct client *temp,struct client **head)
{ struct client *prev=*head;
struct client *current = *head;
struct item *currentitem = (*head)->item_data,*save;
if(temp== *head) \\ if head is the node to be deleted
{
while(currentitem != NULL)
{
save = currentitem;
*head = currentitem->next;
\\ currentitem = currentitem ->next;
free(save);
}
}
else
if(temp->next == NULL) \\ if the node to be deleted is last node then
{
while(currentitem->next != NULL)
{
*prev = currentitem;
currentitem = currentitem ->next;
}
prev->next = NULL;
free(currentitem);
}
else
if(temp != *head && temp->next != NULL)\\ node to be deleted is between head and last node
{while(prev->next != temp)
{ currentitem = *prev;
prev=prev->next;
}
currentitem->next = temp->next;
free(temp);
\\while(currentitem != NULL)
\\ {
\\ save = currentitem;
\\ currentitem = currentitem ->next;
\\\ free(save);
\\ }
\\ temp->item_data = NULL;
\\ free(temp);
\\ temp=temp->next;
}
}