我正在学习链表,我编写了一个具有各种函数的程序来创建和操作列表,其中之一是:
void DeleteNode(int x) {
struct Node* temp = head;
struct Node* prevptr = temp->prev;
struct Node* nextptr = temp->next;
if(temp == NULL) return;
while(temp->data != x) {
temp = temp->next;
}
prevptr->next = temp->next;
nextptr->prev = temp->prev;
free(temp);
}
当我运行我的主函数时:
int main() {
InsertAtHead(2); Print();
InsertAtHead(1); Print();
InsertAtTail(3); Print();
InsertAtTail(4); Print();
DeleteNode(3); Print();
}
输出如下所示:
Forward: 2
Forward: 1 2
Forward: 1 2 3
Forward: 1 2 3 4
Segmentation fault (core dumped)
我想这意味着我在尝试删除节点的过程中丢失了列表,但无法弄清楚如何删除。我在这里做错了什么?
struct Node* prevptr = temp->prev;
这可能是你的程序搞砸的原因。 设置temp = head
后,将 temp 节点设置为等于第一个节点。 除非它是一个双重循环链表,否则第一个节点不应该有prev
的PTR。此外,您不会发送头节点或返回头节点。您temp
设置为等于称为 head 的随机结构,而不让函数知道head
是什么。