[英]Deleting node in linked list
大多数代码工作,但当我尝试删除列表的最后一个元素并打印它时,我在其位置看到一些垃圾数据,我在这里做错了什么? 有人能指出我的错误吗?
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;
}
}
码:
free(temp);
temp=temp->next; // temp->next is invalid
是未定义的行为,一旦释放了一个无法访问它的节点,这样做是非法的。
在这里你检查* head == temp,如果是,你可以释放温度即*头因为它们相等,你只是验证它,而不是你说(* head)=(* head) - > next; 最有可能将*设置为垃圾
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;
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.