双链表C++

来源:互联网 发布:提升淘宝搜索排名 编辑:程序博客网 时间:2024/06/14 05:27
#include <iostream>using namespace std;typedef struct _node{    int data;    _node* prev;    _node* pnext;    _node(int e, _node* p1 = nullptr, _node* p2 = nullptr)         :data(e), prev(p1), pnext(p2){}}node;class doublelist{public:    doublelist() :m_head(new node(-1)){        m_head->pnext = m_head;        m_head->prev = m_head;    }    ~doublelist(){        while (m_head->pnext != m_head){            node* pmiddle = m_head->pnext;            m_head->pnext = pmiddle->pnext;            pmiddle->pnext->prev = m_head;            delete pmiddle;        }        delete m_head;          }    bool isEmpty(){ return m_head->pnext == m_head; }    int length();    void insert(int index, int e);    void append(int e);    void erase(int e);    void remove(int index);    int find(int e);    int serach(int index);    void replace(int olddata, int newdata);    void print();private:    node* m_head;};int  doublelist::length(){    int length = 0;    node* p = m_head;    while (p->pnext != m_head){        ++length;        p = p->pnext;    }    return length;}void doublelist::insert(int index, int e){    if (index < 0 || index > length()){        cout << "index is out of range.\n";    }    else{        int i = 0;        node* p = m_head;        for (; i < index; ++i){            p = p->pnext;        }        node* pnew = new node(e);        p->pnext->prev = pnew;        pnew->pnext = p->pnext;        pnew->prev = p;        p->pnext = pnew;    }}void doublelist::append(int e){    node* pnew = new node(e);    node* ptail = m_head->prev;    ptail->pnext = pnew;    pnew->prev = ptail;    pnew->pnext = m_head;    m_head->prev = pnew;}void doublelist::erase(int e){    node* p = m_head;    while (p->pnext != m_head){        if (p->pnext->data == e){            node* pmiddle = p->pnext;            p->pnext = pmiddle->pnext;            pmiddle->pnext->prev = p;            delete pmiddle;        }        else{            p = p->pnext;        }    }}void doublelist::remove(int index){    if (index < 0 || index > length()-1){        cout << "index is out of range.\n";    }    else{        int i = 0;        node* p = m_head;        for (; i < index; ++i){            p = p->pnext;        }        node* pmiddle = p->pnext;        p->pnext = pmiddle->pnext;        pmiddle->pnext->prev = p;        delete pmiddle;    }}int  doublelist::find(int e){        int i = 0;        node* p = m_head;        while (p->pnext != m_head){            if (p->pnext->data == e){                return i;            }            ++i;            p = p->pnext;        }        return -1;}int  doublelist::serach(int index){    if (index < 0 || index > length() - 1){        cout << "index is out of range.\n";        return -1;    }    else{        int i = 0;        node* p = m_head;        for (; i < index; ++i){            p = p->pnext;        }        return p->pnext->data;    }}void doublelist::replace(int olddata, int newdata){    node* p = m_head;    while (p->pnext != m_head){        if (p->pnext->data == olddata){            p->pnext->data = newdata;        }        p = p->pnext;    }}void doublelist::print(){    node* p = m_head;    while (p->pnext != m_head){        cout << p->pnext->data << ends;        p = p->pnext;    }    cout << endl;}int main(){    doublelist dl;    for (int i = 0; i < 10; ++i){        dl.append(i);    }    dl.insert(1, 1);    dl.print();    cout << "dl length is: " << dl.length()         << endl << "8 index is: " << dl.find(8) << endl;    dl.remove(8);       dl.replace(1, 111);    dl.print();    dl.erase(111);    dl.print();    cout << "index (dl.length()-1) is: " << dl.serach(dl.length() - 1)        << endl << "dl is empty : " << dl.isEmpty() << endl;    return 0;}

这里写图片描述