01/10/2018, 09:55

Destructor của 1 node trong linkedlist

Mình có một vài thắc mắc về linkedlist

Với danh sách liên kết đơn:

  • Khi mình bỏ ~node(){} thì mọi thứ chạy bình thường, ngược lại nếu mình giữ thì chương trình không chạy lệnh nào và bị runtime error.

  • Nếu mình giữ ~node(){} và comment dòng l.removeFirst(); thì các dòng lệnh khác đều chạy nhưng vẫn dính runtime error.

      #include <iostream>
    
      using namespace std;
    
      struct node{
          const char* data;
          node* next;
    
          node(const char* data = NULL, node* next = NULL){
              this->data = data;
              this->next = next;
          }
          ~node(){}  // không comment dòng này thì bị lỗi runtime
      };
    
      struct SLinkedList{
          node* head;
          node* tail;
          unsigned long size;
    
          SLinkedList(){
              head = NULL;
              tail = NULL;
              size = 0;
          }
          ~SLinkedList(){
              while (head != NULL) {
                  removeFirst();
              }
          }
          const bool isEmpty() { return size == 0; }
          void addFirst(const char* data){
              head = new node(data, head);
              if (this->isEmpty()) tail = head;
              size++;
          }
          void removeFirst(){
              if (this->isEmpty() == false){
                  node* temp = head;
                  head = head->next;
                  delete[] temp;
              }
          }
          void addLast(const char* data){
              node* newNode = new node(data, NULL);
              if (this->isEmpty()) head = newNode;
              else tail->next = newNode;
              tail = newNode;
              size++;
          }
          const friend ostream& operator << (ostream&, const SLinkedList&);
      };
    
      const ostream& operator << (ostream& out, const SLinkedList& list){
          out << list.head->data;
          for (node* p = list.head->next; p != NULL; p = p->next) {
              out << "." << p->data;
          }
          out << endl;
          return out;
      }
    
      int main(int argc, char const *argv[]) {
          SLinkedList l;
          l.addFirst("sleep");
          l.addFirst("eat");
          l.addFirst("code");
          l.removeFirst(); // nếu comment dòng này thì chương trình vẫn chạy nhưng không exit
          l.addLast("code");
          l.addLast("repeat");
          cout << l;
    
          return 0;
      }
    

Với danh sách liên kết kép thì có hay không destructor của node cũng không ảnh hưởng gì

#include <iostream>

using namespace std;

struct DNode{
    const char* data;
    DNode* prev;
    DNode* next;

    DNode(const char* data = NULL, DNode* prev = NULL, DNode* next = NULL){
        this->data = data;
        this->prev = prev;
        this->next = next;
    }
    ~DNode(){}
};

struct DLinkedList{
    DNode header, trailer;

    DLinkedList(){
        header.next = &trailer;
        trailer.prev = &header;
    }
    ~DLinkedList(){
        for (DNode* p = header.next; p != &trailer;) {
            DNode* temp = p->next;
            delete p;
            p = temp;
        }
    }
    void insertAfter(DNode* p, const char* data){
        DNode* n = new DNode(data, p, p->next);
        p->next->prev = n;
        p->next = n;
    }
    void remove(DNode* p){
        p->prev->next = p->next;
        p->next->prev = p->prev;
        delete p;
    }
    const friend ostream& operator << (ostream& out, const DLinkedList& list){
        for (DNode* p = list.header.next; p != &(list.trailer); p = p->next) {
            out << p->data << " ";
        }
        out << endl;
    }
};

int main(int argc, char const *argv[]) {
    DLinkedList dl;
    dl.insertAfter(&dl.header, "Aa");
    dl.insertAfter(&dl.header, "Bb");
    dl.insertAfter(&dl.header, "Cc");
    dl.insertAfter(&dl.header, "Dd");
    dl.remove(dl.header.next);
    dl.insertAfter(&dl.header, "Ee")
    cout << dl;

    return 0;
}

Vậy tại sao lại thế…

Bài liên quan
0