双向循环链表(c++)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaodu655/article/details/81450311
#include<iostream>
using namespace std;
struct ListNode
{
    ListNode()
    :_data(0)
    ,_prev(0)
    , _next(0)
    {}
    ListNode( const int data)
    :_data(data)
    , _prev(0)
    , _next(0)
    {}
    int _data;
    ListNode*_prev;
    ListNode*_next;
};
class List
{
    typedef ListNode Node;
public:
    List()
        :pHead(new Node(0))
    {
        pHead->_next = pHead;
        pHead->_prev = pHead;
    }
    List(int size, int data)
        :pHead(new Node(0))
    {
        pHead->_next = pHead;
        pHead->_prev = pHead;
        while (size--)
        {
            PushBack(data);
        }
    }
    List(const List&l)//拷贝构造函数
        :pHead(new Node)
    {
        pHead->_next = pHead;
        pHead->_prev = pHead;
        Node*cur = l.pHead->_next;
        while (cur != l.pHead)
        {
            this->PushBack(cur->_data);
            cur = cur->_next;
        }
    }
    void PushBack(int data);//尾插
    void PopBack();//尾删
    void PushFront(int data);//头插
    void PopFront(); //头删
    void insert(Node*pos, int data);//任意位置插入
    void Erase(Node*pos);//任意位置删除
    Node* Find(int data);//寻找指定元素
    void clear();//清空
    bool Empty()const;//判断链表是否为空
    ~List()
    {
        clear();
        delete pHead;
        pHead = NULL;
    }
    friend ostream&operator<<(ostream&_cout, List& l);
private:
    ListNode*pHead;
};
void List::PushBack(int data)
{
    /*Node*newNode = new Node(data);
    Node*cur = pHead->_prev;
    cur->_next = newNode;
    newNode->_prev = cur;
    newNode->_next = pHead;
    pHead->_prev = cur;*/
    Node* newNode = new Node(data);
    newNode->_prev = pHead->_prev;
    newNode->_next = pHead;
    pHead->_prev = newNode;
    newNode->_prev->_next = newNode;
}
void  List::PopBack()
{
    Node*pDel = pHead->_prev;
    pDel->_prev->_next = pHead;
    pHead->_prev = pDel->_prev;
    delete pDel;
}
void  List::PushFront(int data)
{
    Node*newNode = new Node(data);
    newNode->_next = pHead->_next;
    newNode->_prev = pHead;
    pHead->_next = newNode;
    pHead->_next->_prev = newNode;
}
void  List::PopFront()
{
    Node*delNode = pHead->_next;
    Node*pNext = pHead->_next->_next;

    delete delNode;

    pHead->_next = pNext;
    pNext->_prev = pHead;
}
void  List::insert(Node*pos, int data)
{
    Node*newNode = new Node(data);
    newNode->_next = pos;
    newNode->_prev = pos->_prev;
    pos->_prev->_next = newNode;
    pos->_prev = newNode;
}
void  List::Erase(Node*pos)
{
    Node*NextNode = pos->_next;
    Node*prevNode = pos->_prev;
    prevNode->_next = NextNode;
    NextNode->_prev = prevNode;
    delete pos;
}
ListNode*   List::Find(int data)//寻找指定元素
{
    Node*pcur = pHead;
    while (pcur->_next != pHead)
    {
        if (pcur->_data == data)
        {
            return pcur;
        }
        pcur = pcur->_next;
    }
    return NULL;
}
void  List::clear()
{
    /*Node*cur = pHead->_next;
    while (cur != pHead)
    {
    Node*temp = cur;
    cur = cur->_next;
    delete temp;
    }*/
    Node* cur = pHead->_next;
    while (cur != pHead)
    {
        Node* tmp = cur->_next;
        delete cur;
        cur = tmp;
    }

    pHead->_next = pHead;
    pHead->_prev = pHead;
}
bool  List::Empty()const//判断链表是否为空
{
    return pHead == pHead->_next;
}
ostream&operator<<(ostream&_cout, List& l)
{
    ListNode* cur = l.pHead;
    while (cur->_next != l.pHead)
    {
        _cout << cur->_data << "->";
        cur = cur->_next;
    }
    _cout << cur->_data << "->";
    _cout << "NULL";
    return _cout;
}
void test1()
{
    List l;
    l.PushBack(1);
    l.PushBack(2);
    l.PushBack(3);
    l.PushBack(4);
    l.PushBack(5);
    cout << "尾插" << endl;
    cout << l << endl;
    l.PushFront(6);
    l.PushFront(7);
    l.PushFront(8);
    l.PushFront(9);
    l.PushFront(10);
    cout << "头插" << endl;
    cout << l << endl;
    ListNode*pos = l.Find(2);
    cout << "查找指定位置" << endl;
    cout << l << endl;
    l.PopBack();
    cout << "尾删" << endl;
    cout << l << endl;
    l.PopFront();
    cout << "头删" << endl;
    cout << l << endl;
    cout << "指定位置删除" << endl;
    l.Erase(pos);
    cout << l << endl;
    l.clear();
}
void test2()
{
    List l1(5, 100);
    cout << l1 << endl;
}
int main()
{
    test1();
    test2();
    system("pause");
    return 0;
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/81450311
今日推荐