Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除链表中的节点_C_Linked List - Fatal编程技术网

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;
}
}