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òngl.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