双链表错误实现Deque
Deque implementation by doubly list error
我试图实现一个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 << "ttTn";
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 << " jn";
}
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 listn";
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 listn";
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 nn";
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 deletedn";
break;
case 4:
y = Q.pop();
cout << y << " Is deletedn";
break;
case 5:
cout << "Number of elemnts =" << Q.size() << endl;
break;
case 6:
Q.print();
break;
case 7:
cout << "Exiting donen";
return;
default:
cout << "Incorrect input. Try againn";
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");
}
我不确定,但我认为这是DLinkedList::add
内部的错误:
v->prev->next = v->prev = u;
我认为这将u
分配给v->prev
,然后你失去了旧的v->prev
,所以它们永远不会正确连接。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- C STL中如何实现Deque
- 在deque实现中将1/2一个向量移动到另一个向量
- 使用模板实现 Deque 时出现问题
- 使用 deque 在C++中实现循环缓冲区
- 基于 STL deque 的树与自己的二叉树实现
- STL队列(OR堆栈)的deque和链表(+vector)实现之间有什么区别
- c++ std::deque实现:为什么不使用循环缓冲区
- 为什么STL deque不被实现为一个循环向量?
- libstdc++实现c++ 11 deque接口
- 如何实现非连续容器(如std::deque)的随机访问迭代器
- 用字符数组实现C++Deque
- 双链表错误实现Deque
- STL内部:deque实现
- STL deque是作为循环链表实现的