通过双列表错误实现Deque实现

时间:2014-03-23 18:50:48

标签: c++ list deque

我试图通过双向链表实现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");
}

1 个答案:

答案 0 :(得分:0)

我不确定,但我认为这是DLinkedList::add内部的错误:

v->prev->next = v->prev = u;

我认为将u分配给v->prev,然后您丢失了旧的v->prev,以便永远无法正确链接。