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都指向同一个节点。