Ошибка сегментации при удалении узла из конца двусвязного списка - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь удалить узел из конца двусвязного списка, но получаю:

ошибка сегментации

Я добавил разные функции для добавления узла, от начала, с конца и в любой позиции. Я проверил вставку узлов, все работает нормально, 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;
}

1 Ответ

0 голосов
/ 10 января 2019

Я получаю ошибку, если у меня есть только один элемент в списке. Когда у вас есть только один элемент в списке, вы не можете установить, что он находится слева направо, указывая на 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;
  }

}
...