C++实现双链表

        双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。可以向前遍历,也可以向后遍历,双链表中还有一个尾指针。
      
       双链表的操作比单链表要稍微复杂一些,因为删除和插入都要操控一个额外的指针,特别是在双链表的插入中指针的指向顺序是不可修改的。当然双链表可以反向查找结点优于单链表。在操作发生时必须要更新尾指针。
       下面来实现双链表的各个功能:
#include<iostream>
#include<assert.h>
using namespace std;
typedef int DataType;
struct ListNode
{
    DataType _data;
    ListNode *_next;
    ListNode *_prev;
    ListNode(const DataType x)
        :_data(x), _next(NULL), _prev(NULL)
    {}
};
class List
{
    typedef ListNode Node;
public:
    List()
        :_head(NULL), _tail(NULL)
    {
    }
    void PushBack(DataType x)
    {
        if (_head == NULL)
        {
            _head = _tail = new Node(x);
        }
        else
        {
            Node* tmp = new Node(x);
            _tail->_next = tmp; 
            tmp->_prev = _tail;
            _tail = _tail->_next;
        }
    }
    void PushFront(DataType x)
    {
        if (_head == NULL)
        {
            _head = _tail = new Node(x);
        }
        else
        {
            Node *tmp = new Node(x);
            tmp->_next = _head;
            _head->_prev = tmp;
            _head = tmp;
        }
    }
    void Display()
    {
        if (_head == NULL)
            return;
        else
        {
            Node* cur(_head);
            while (cur != NULL)
            {
                cout << cur->_data << " ";
                cur = cur->_next;
            }
            cout << endl;
        }
    }
    void PopBack()
    {
        if (_head == NULL||_head==_tail)
        {
            delete _tail;
            _head = _tail = NULL;
        }
        else
        {
            _tail = _tail->_prev;
            delete _tail->_next;
        }
    }
    void PopFront()
    {
        if (_head == NULL || _head == _tail)
        {
            delete _tail;
            _head = _tail = NULL;
        }
        else
        {
            _head = _head->_next;
            delete _head->_prev;
        }
    }
    void Destroy()
    {
        if (_head == _tail)
        {
            delete _tail;
            _head = _tail = NULL;
        }
        else
        {
            while (_head->_next != NULL)
            {
                _head = _head->_next;
                delete _head->_prev;
            }
            delete _tail;
            _head = _tail = NULL;
        }
    }
    Node* Find(DataType x)
    {
        if (_head == NULL)
            return NULL;
        else
        {
            Node *cur(_head);
            while (cur != NULL)
            {
                if (cur->_data == x)
                {
                    break;
                }
                cur = cur->_next;
            }
            return cur;
        }
    }
    void Insert(Node* pos, DataType x)
    {
        assert(pos);
        if (pos == _head)
        {
            PushFront(x);
        }
        else
        {
            Node *tmp = new Node(x);
            tmp->_next = pos;
            pos->_prev->_next = tmp;
            tmp->_prev = pos->_prev;
            pos->_prev = tmp;
        }
    }
    void Erase(Node* pos)
    {
        assert(pos);
        if (pos == _head)
        {
            _head = _head->_next;
            delete pos;
        }
        else
        {
            pos->_next->_prev = pos->_prev;
            pos->_prev->_next = pos->_next;
            delete pos;
            pos = NULL;
        }
    }
    void Reverse()//定义了一个NewHead 让其从第一个一直走到最后一个,将其再给_head
    {
        if (_head == _tail)
        {
            return;
        }
        else
        {
            ListNode* cur = _head;
            ListNode* tmp = cur;
            ListNode* NewHead = NULL;
            while (cur)
            {
                tmp = cur;
                cur = cur->_next;
                tmp->_next = NewHead;
                tmp->_prev = cur;
                NewHead = tmp;
            }
            _head = NewHead;
            }
    }
private:
    Node *_head;
    Node *_tail;
};
void test()
{
     List l1;
    l1.PushBack(0);
    l1.PushBack(1);
    l1.PushBack(2);
    l1.PushBack(3);
    /*l1.PushFront(2);
    l1.PushFront(1);
    l1.PushFront(0);*/
    /*l1.PopBack();
    l1.PopBack();
    l1.PopBack();*/
    //l1.PopFront();
    //l1.PopFront();
    //l1.PopFront();
    //l1.Destroy();
    //l1.Find(1);
    //l1.Insert(l1.Find(5), 9);
    //l1.Insert(l1.Find(1), 6);
    //l1.Insert(l1.Find(3), 5);
    //l1.Insert(l1.Find(0), 9);
    //l1.Erase(l1.Find(1));
    //l1.Erase(l1.Find(10));
    l1.Reverse();
    l1.Display();
}

int main()
{
    test();
    system("pause");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值