用C++实现单链表的基本函数以及增删查改

用C++实现双链表的增删查改以及双向链表的逆转

C++实现顺序表基本函数以及增删查改

单链表:
链表中的数据是以节点来表示的,每个结点的构成:元素( 数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

#include<iostream>
#include<windows.h>
#include<assert.h>
using namespace std;
typedef int DataType;

struct SListNode
{
    SListNode* _next;
    DataType _data;

    SListNode(DataType x)
        :_data(x)
        , _next(NULL)
    {}
};

class SList
{
    typedef SListNode Node;
public:
    SList()
        :_head(NULL)
        , _tail(NULL)
    {}
    SList(const SList& s)
        :_head(NULL)
        , _tail(NULL)
    {
        Node*cur = s._head;
        while (cur)
        {
            PushBack(cur->_data);
            cur = cur->_next;
        }
    }
    //l1=l2(传统写法)
    SList&operator=(const SList &l)
    {
        if (this != &l)
        {
            this->Destroy();
            Node*head = l._head;
            while (head)
            {
                PushBack(head->_data);
                head = head->_next;
            }
            return *this;
        }
    }
    //l1=l2(现代写法)
    SList&operator=(SList l)
    {
        swap(_head, l._head);
        swap(_tail, l._tail);
        return *this;

    }
    ~SList()
    {
        Destroy();
    }

    void Destroy()
    {
        Node*cur = _head;
        while (cur)
        {
            Node*next = cur->_next;
            delete cur;
            cur = next;
        }
        _head = _tail = NULL;

    }
   //增删查改
    void PushBack(DataType x)
    {
        if (_head == NULL)
        {
            _head = _tail = new Node(x);
        }
        else
        {
            _tail->_next = new Node(x);
            _tail = _tail->_next;
        }
    }
    void PopBack()
    {
        if (_head == NULL)
        {
            return;
        }
        else if (_head->_next == NULL)
        {
            delete _head;
            _head = _tail = NULL;
        }
        else
        {
            Node* tmp = _head;
            while (tmp->_next->_next != NULL)
            {
                tmp = tmp->_next;
            }
            _tail = tmp;
            tmp->_next = NULL;
        }
    }
    void PushFront(DataType x)
    {
        if (_head == NULL)
        {
            _head=_tail = new Node(x);
        }
        else
        {
            Node *tmp = new Node(x);
            tmp->_next = _head;
            _head = tmp;
        }

    }
    void PopFront()
    {
        if (_head == _tail)
        {
            delete _head;
            _head = _tail = NULL;
        }
        else
        {
            Node *tmp = _head->_next;
            delete _head;
            _head = tmp;
        }



    }
        // 插入一个节点在pos的前面 
    void Insert(Node* pos, DataType x)
    {
        assert(pos);
        Node*cur = _head;
        while (cur->_next != pos)
        {
            cur = cur->_next;
        }
        Node*tmp = new Node(x);
        cur->_next = tmp;
        tmp->_next = pos;
    }
    Node* Find(DataType x)//查找X
    {
        Node*tmp = _head;
        while (tmp)
        {
            if (tmp->_data == x)
            {
                return tmp;
            }
            tmp = tmp->_next;

        }
        return NULL;

    }
    void Erase(Node* pos)
    {
        assert(pos);
        if(pos->_next==NULL)
        {
            PopBack();
        }
        else
        {

            Node*cur = _head;
            while (cur->_next != pos)
            {
                cur = cur->_next;

            }

            cur->_next = pos->_next;
            delete pos;
        }

    }
    void Print()
    {
        Node*tmp = _head;
        while (tmp != NULL)
        {
            cout << tmp->_data << " ";
            tmp = tmp->_next;
        }
        cout << endl;
    }

private:
    Node* _head;
    Node* _tail;
};

你可能感兴趣的:(c++,链表)