双向链表基础操作C++实现

来源:互联网 发布:智能手机看书软件 编辑:程序博客网 时间:2024/06/08 11:49

Node.h:

template <class T> struct Node{    T val;    Node<T>* next;    Node<T>* prev;    Node(T nVal)    {        val = nVal;        next =prev= nullptr;    }    Node(void){}};
#include "Node.h"#include <iostream>using namespace std;template <class> class LinkList{    int size;public:    Node<T>* head;    Node<T>* tail;    LinkList(void)    {        head = tail = nullptr;        size = 0;    }    ~LinkList(void){ Clear(); }    void AddBack(T val)    {        Node<T>* pNode = new Node<T>(val);        if (head == nullptr)        {            head = tail = pNode;        }        else        {            tail->next = pNode;            pNode->prev = tail;            tail = pNode;        }        size++;    }    void AddFront(T val)    {        Node<T>* pNode = new Node<T>(val);        if (head == nullptr)        {            head = tail = pNode;        }        else        {            head->prev = pNode;            pNode->next = head;            head = pNode;        }        size++;    }    bool insertAt(int pos, T val)    {        Node<T>* pNode = nullptr;        if (pos<0 || pos>size)        {            cout << "out of range" << endl;            return false;        }        pNode = new Node<T>(val);        if (pos == 0)            AddFront(val);        else if (pos = size - 1)            AddBack(val);        else        {            Node<T>* prevNode = GetPointerAt(pos - 1);            pNode->next = prevNode->next;            pNode->prev = prevNode;            preNode->next->prev = pNode;            prevNode->next = pNode;        }        size++;        return true;    }    bool RemoveAt(int pos)    {        Node<T>* pNode = nullptr;        if (size == 0)        {            cout << "list is empty" << endl;            return false;        }        if (pos<0 || pos>size - 1)        {            cout << "out of range" << endl;            return false;        }        if (size == 1)            Clear();        else        {            if (pos == 0)            {                pNode = head;                head = head->next;                head->prev = nullptr;                delete pNode;            }            else            {                Node<T>* prevNode = GetPointerAt(pos - 1);                pNode = prevNode->next;                prevNode->next = pNode->next;                pNode->next->prev = prevNode;                delete pNode;                if (pos == size - 1)                    tail = prevNode;            }        }    }    bool RemoveBack()    {        return RemoveAt(size - 1);    }    bool RemoveFront()    {        return RemoveAt(0);    }    int Find(T val)    {        int index = 0;        Node<T>* ip = head;        while (ip != nullptr)        {            if (ip->val == val)                return index;            ip = ip->next;            index++;        }        return -1;    }    bool IsEmpty()    {        return size == 0 ? true : false;    }    void Clear()    {        while (head != nullptr)        {            Node<T>* tmp = head->next;            delete head;            head = tmp;        }        tail = nullptr;        size = 0;    }    private:        Node<T>* GetPointerAt(int pos)        {            Node<T>* pNode = nullptr;            if (pos<0 || pos>size - 1)                cout << "out of range" << endl;            else            {                pNode = head;                for (int i = 1; i <= pos; i++)                    pNode = pNode->next;            }            return pNode;        }};
0 0