C 删除链表尾部:为什么一个特定的方法胜出';行不通

C 删除链表尾部:为什么一个特定的方法胜出';行不通,c,function,pointers,struct,linked-list,C,Function,Pointers,Struct,Linked List,我试图理解为什么某个函数会删除链表的尾部而不是另一个 这是我的链表结构: typedef struct node { int data; struct node *next; struct node *prev; } node; 我的尾部插入的实现: node *tail_insert(node *head, int data) { node *temp; if (head == NULL) return create_doubly_n

我试图理解为什么某个函数会删除链表的尾部而不是另一个

这是我的链表结构:

typedef struct node
{
    int data;
    struct node *next;
    struct node *prev;
} node;
我的尾部插入的实现:

node *tail_insert(node *head, int data)
{
    node *temp;

    if (head == NULL)
        return create_doubly_node(data);

    for (temp = head; temp->next != NULL; temp = temp->next)
        ;

    temp->next = create_doubly_node(data);
    temp->next->prev = temp->next;

    return head;

}
此函数用于删除尾部:

node *tail_delete(node *head)
{
    node *temp, *prev;

    if (head == NULL)
        return head;

    temp = head;

    while (temp->next != NULL)
    {
        prev = temp;
        temp = temp->next;
    }

    free(temp);
    prev->next = NULL;

    return head;
}
与此相反:

node *tail_delete(node *head)
{
    node *temp, *prev;

    if (head == NULL)
        return head;

    temp = head;

    while (temp->next != NULL)
    {
        temp = temp->next;
    }

    prev = temp->prev;
    free(temp);
    prev->next = NULL;

    return head;
}

我分配node*prev的方式存在差异。

您的以下语句是错误的,您的第二个方法不起作用,因为您的prev指针指向错误的节点:-

temp->next->prev = temp->next; //here prev is pointing to itself
                               //actually prev = create_doubly_node(data);
将其更正为:-

 temp->next->prev = temp; //as temp is pointing to the previous node of last node

以下语句错误,第二个方法无法使用,因为prev指针指向错误的节点:-

temp->next->prev = temp->next; //here prev is pointing to itself
                               //actually prev = create_doubly_node(data);
将其更正为:-

 temp->next->prev = temp; //as temp is pointing to the previous node of last node

您是否检查了链接列表是否正确维护了指针
prev
?My node*prev已设置为当前节点,而不是实际的上一个节点。谢谢。您好,正如您所说,您的上一个节点指向的当前节点不是正确的双链接列表。这意味着prev指向自身,两个函数的行为将不同。在第一种删除方法中,prev将指向最后一个节点的上一个节点,在第二种方法中,prev和temp都指向同一个节点。是否检查了链接列表是否正确地维护了指针
prev
?My node*prev设置为当前节点,而不是实际的上一个节点。谢谢。您好,正如您所说,您的上一个节点指向的当前节点不是正确的双链接列表。这意味着prev指向自身,两个函数的行为将不同。在第一个delete方法中,prev将指向最后一个节点的前一个节点,在第二个方法中,prev和temp都指向同一个节点。