从双向链表末尾删除节点时出现分段错误

Segmentation fault during deleting a node from the end of doubly linked list

本文关键字:分段 错误 节点 双向链表 删除      更新时间:2023-10-16

我正在尝试从双向链表的末尾删除一个节点,但我得到:

分段错误

我添加了不同的函数来添加节点,从开始,从结束,到任何位置。我检查了节点的插入,它工作正常,DLL显示正确,但是当涉及到删除功能时,它给出了分段错误。

struct Node {
    Node* left;
    Node* right;
    int data;
};
Node* head = NULL;
void insertion_At_End(int element) {
    Node* ptr = head;
    Node* temp = new Node;
    temp->left = temp->right = NULL;
    temp->data = element;
    if(head==NULL) {
        head = temp;
    } else {
        while(ptr->right!=NULL) {
            ptr = ptr->right;
        }
        temp->left = ptr->right;
        ptr->right = temp;
    }
}
void insertion_At_Beg(int element) {
    Node* ptr = head;
    Node* temp = new Node;
    temp->left = temp->right = NULL;
    temp->data = element;
    if(head==NULL) {
        head = temp;
    } else {
        temp->right = ptr;
        ptr->left = temp;
        head = temp;
    }
}
void insertion_At_Pos(int element , int position , int length) {
    Node* ptr;
    Node* temp = new Node;
    temp->left = temp->right = NULL;
    temp->data = element;
    int counter = 1;
    if(position==1) {
        insertion_At_Beg(element);
    }
    else if(position==length) {
        insertion_At_End(element);
    }
    else {
        ptr = head;
        while(counter!=(position-1)) {
            ptr = ptr->right;
            counter++;
        }
        temp->right = ptr->right;
        ptr->right->left = temp;
        temp->left = ptr;
        ptr->right = temp;
    }
}
void deletion_At_End() {
    Node *ptr = head;
    while(ptr->right!=NULL) {
        ptr = ptr->right;
    }
    ptr->left->right=NULL;
    delete ptr;
}

如果我列表中只有一个元素,我会收到错误。当列表中只有一个元素时,您无法设置它左侧指向 NULL 的内容,因为它不存在!这对我有用:

void deletion_At_End() {
  Node *ptr = head;
  while(ptr->right!=NULL) {
      ptr = ptr->right;
  }
  if(ptr->left == NULL){
      delete ptr;
  }
  else{
      ptr->left->right=NULL;
      delete ptr;
  }
}