双链表错误实现Deque

Deque implementation by doubly list error

本文关键字:Deque 实现 错误 链表      更新时间:2023-10-16

我试图实现一个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,所以它们永远不会正确连接。