我如何从链接列表中删除任何项目?

How do i delete any item from a linked list?

我正在尝试编写一个函数,从链表中删除给定位置的元素,目前我使用的是仅具有头指针的链表。现在可能是用户输入的位置大于链表的大小,因此为了补救我写了这个:

int delete(struct node** head, int pos)
{
    struct node* temp = *head;
    while(pos!=0 && temp->next!=NULL)
    {
        temp=temp->next;
        pos--;
    }
    if(pos>0)
        return 0;

}

但它给出了以下错误

fish: './a.out' terminated by signal SIGSEGV (Address boundary error)

我尝试通过编写新代码来调试它

int delete(struct node** head)
{
    if((*head)->next==NULL)
    return 1;
}

但它给出了同样的错误

正如@paddy 评论的那样,

我没有考虑 head 本身指向 NULL 的情况。

一个简单的 if 语句解决了它

struct node* temp = *head;
    if(temp==NULL){
        printf("Empty LL\n");
        free(temp);
        return 0;
    }

headNULL 时,temp->next 的计算将给出未定义的行为或您遇到的错误。

但是,您的函数还有更多需要更正的地方。

  • 没有发生删除。要删除一个节点,它的前身应该有它的 next 属性 更新指向被删除节点之后的节点。然后应释放已删除的节点。

  • 删除列表的第一个节点时,应修改*head的值。

  • 函数应该return一个int,所以当删除成功时(和pos == 0在循环之后),应该有一个return 被执行,可能 returning 1 表示成功。

  • 没问题,但我建议您为您的函数使用不同的名称。如果你转向 C++,那么 delete 将是一个保留字。

所以:

int removeNode(struct node** head, int pos) {
    if (*head == NULL) {
        return 0;
    }

    struct node* temp = *head;
    if (pos == 0) { // Case where first node must be removed
        *head = (*head)->next; // Modify head reference
        free(temp);
        return 1; // Indicate success
    }

    while (pos > 1 && temp->next != NULL) {
        temp = temp->next;
        pos--;
    }
    if (pos != 1 || temp->next == NULL) {
        return 0; // Invalid position
    }
    //  Remove the node
    struct node* prev = temp;
    temp = temp->next;
    prev->next = temp->next;
    free(temp);
    return 1; // Indicate success
}