我试图通过双向链表实现Deque c ++代码,但是当我试图通过visual 2010播放我的代码时,它会显示垃圾值!
由于我已经跟踪了代码,我发现它实际上(在内存中)没有将新节点与预告片链接起来。 问题是什么:(
这里是代码
#include <iostream>
using namespace std;
class DNode {
private:
int elem;
DNode* prev;
DNode* next;
friend class DLinkedList;
};
class DLinkedList{
public:
DLinkedList();
~DLinkedList();
bool empty() const;
const int& front() const;
const int& back() const;
void addFront(const int& e);
void addBack(const int& e);
void removeFront();
void removeBack();
void print(DNode* f) {
DNode* i = f->next;
do {
cout << header->elem << "ttT\n";
i = i->next;
} while(i != trailer);
}
DNode* head() {
return header;
}
private:
DNode* header;
DNode* trailer;
protected:
void add(DNode* v, const int& e);
void remove(DNode* v);
};
DLinkedList::DLinkedList() {
header = new DNode;
trailer = new DNode;
header->next = trailer;
trailer->prev = header;
}
DLinkedList::~DLinkedList() {
while ( !empty() )
removeFront();
delete header;
delete trailer;
}
bool DLinkedList::empty() const {
return (header->next == trailer);
}
const int& DLinkedList::front() const {
return header->next->elem;
}
const int& DLinkedList::back() const {
return trailer->prev->elem;
}
void DLinkedList::add(DNode* v, const int& e) {
DNode* u = new DNode;
u->elem = e;
u->next = v;
u->prev = v->prev;
v->prev->next = v->prev = u;
}
void DLinkedList::addFront(const int& e) {
add(header->next, e);
cout << header->next->elem << " j\n";
}
void DLinkedList::addBack(const int& e) {
add(trailer, e);
}
void DLinkedList::remove(DNode* v) {
DNode* u = v->prev;
DNode* w = v->next;
u->next = w;
w->prev = u;
delete v;
}
void DLinkedList::removeFront() {
remove(header->next);
}
void DLinkedList::removeBack() {
remove(trailer->prev);
}
class LinkedDeque{
public:
LinkedDeque();
int size() const;
bool empty() const;
const int& front() const;
const int& back() const;
void inject(const int& e);
void push(const int& e);
const int& pop();
const int& eject();
void print(){
if (!D.empty()) { //if empty return true
D.print(D.head());
}
else {
cout << "Empty deque \n";
return;
}
}
DNode* getHeader(){
return D.head();
}
private:
DLinkedList D;
int number_nodes;
};
void LinkedDeque::inject(const int& e) {
D.addFront(e);
number_nodes++;
}
void LinkedDeque::push(const int& e) {
D.addBack(e);
number_nodes++;
}
LinkedDeque::LinkedDeque() : D() {
number_nodes = 0;
}
const int& LinkedDeque::pop() {
if(!D.empty()) {
int save = D.back();
D.removeBack();
number_nodes--;
return save;
}
else {
cout << "You can't remove from empty list\n";
return-999;
}
}
const int& LinkedDeque::eject() {
if(!D.empty()) {
int save = D.front();
D.removeFront();
number_nodes--;
return save;
}
else{
cout << "You can't remove from empty list\n";
return-999;
}
}
bool LinkedDeque::empty() const {
return D.empty();
}
int LinkedDeque::size() const {
return number_nodes;
}
void interFace(LinkedDeque& Q) {
int what,inserted_number;
cout<<"Choose the number of an operation below \n\n";
cout<<"***************************************************\n";
cout<<"* 1. insert in front 2. inesrt in last *\n";
cout<<"* 3.delete from front 4. delete from last *\n";
cout<<"* 5.print the size 6.print list 7.exit *\n";
cout<<"***************************************************\n";
do{
int t, y;
cin >> what;
switch(what){
case 1:
cout << "Insert an element \n";
cin >> inserted_number;
Q.inject(inserted_number);
break;
case 2:
cout << "Insert an element \n";
cin >> inserted_number;
Q.push(inserted_number);
break;
case 3:
t = Q.eject();
cout << t << " Is deleted\n";
break;
case 4:
y = Q.pop();
cout << y << " Is deleted\n";
break;
case 5:
cout << "Number of elemnts =" << Q.size() << endl;
break;
case 6:
Q.print();
break;
case 7:
cout << "Exiting done\n";
return;
default:
cout << "Incorrect input. Try again\n";
continue;
} //switch
cout<<"Choose the number of an operation \n";
} while (what !=7); //loop
}
void main() {
LinkedDeque H;
H.inject(10);
H.print();
//interFace(H);
system("PAUSE");
}
答案 0 :(得分:0)
我不确定,但我认为这是DLinkedList::add
内部的错误:
v->prev->next = v->prev = u;
我认为将u
分配给v->prev
,然后您丢失了旧的v->prev
,以便永远无法正确链接。