C++实现简单的带头循环双向链表

C++实现简单的带头循环双向链表

list
   带头双向循环链表听着感觉好像很难的样子,其实,它的实现相对比较简单,它的前驱结点与后继结点都已知,也不需要再遍历得到指针。
   在构造链表的时候,记得要初始化头结点。还有在操作前后指针的时候,要记得将指针保存好,得理清楚这几个结点的关系,不然就会导致有些结点丢失。
List.cpp

#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

typedef int DataType; 
struct ListNode 
{ 
    ListNode* _next; 
    ListNode* _prev; 
    DataType _data;
    ListNode(DataType x) 
        :_next(NULL) 
         ,_prev(NULL) 
         ,_data(x) 
    {} 
}; 
//带头双链表
class List 
{ 
    typedef ListNode Node; 
public: 
    List() 
        :_head(new Node(DataType())) 
    { 
        _head->_next = _head; 
        _head->_prev = _head; 
    } 

    List(const List& l)
        :_head(new Node(DataType())) 
    { 
       _head->_next = _head; 
       _head->_prev = _head; 
       Node *cur =l._head->_next;
       Node *prev = NULL;
       Node *tmp = _head;
       while(cur != l._head)
       {
           prev = tmp;
           tmp = new Node(cur->_data);
           tmp->_prev = prev;
           prev->_next = tmp;
           cur=cur->_next;
       }
       tmp->_next = _head;
       _head->_prev = tmp;
    } 
List& operator=(List l)
{
    Node *tmp = _head;
    _head = l._head;
    l._head = tmp;
    return *this;
}
~List()
{
    Node *tmp = _head->_next;
    while(tmp != _head)
    {
        Node *cur = tmp->_next;
        delete tmp;
        tmp = cur;
    }
}
//尾插
void PushBack(DataType x)
{
// 当写了Insert之后,就可以直接使用insert函数来进行插入,不需要再自己实现
//    Node *tmp = _head->_prev;
//    Node *newnode = new Node(x);
//    tmp->_next = newnode;
//    newnode->_prev = tmp;
//    newnode->_next = _head;
//    _head->_prev = newnode;
    Insert(_head->_prev,x);
}
//头插
void PushFront(DataType x)
{
//    Node *newnode = new Node(x);
//   newnode->_next = _head->_next;
//   _head->_next = newnode;
//   newnode->_prev = _head;
//   newnode->_next->_prev = newnode;
   Insert(_head->_next,x);
}
//尾删
void PopBack()
{
// 可以复用下面写的Erase函数,可以在任意位置删除。
//    Node *cur = _head->_prev;
//    cur->_prev->_next = _head;
//    _head->_prev = cur->_prev;
//    delete cur;
    Erase(_head->_prev);
}
//头删
void PopFront()
{
//    if(_head->_next==_head)
//        return;
//    Node *tmp = _head->_next->_next;
//    delete _head->_next;
//    _head->_next = tmp;
//    tmp->_prev = _head;
    Erase(_head->_next);
}
Node* Find(DataType x)
{
    if(_head->_next == _head)
        return NULL;
    Node *cur = _head->_next;
    while(cur != _head)
    {
        if(cur->_data == x)
            return cur;
        cur=cur->_next;
    }
    return NULL;
}
void Insert(Node* pos, DataType x)
{
    Node *newnode = new Node(x);
    newnode->_next = pos;
    pos->_prev->_next = newnode;
    newnode->_prev = pos->_prev;
    pos->_prev = newnode;
}
void Erase(Node* pos)
{
    Node *next = pos->_next;
    Node *prev = pos->_prev;
    delete pos;
    next->_prev = prev;
    prev->_next = next;
}
void Print()
{
    Node *tmp = _head->_next;
    while(tmp != _head)
    {
        printf("[%d] ",tmp->_data);
        tmp = tmp->_next;
    }
    printf("\n");
}
private: 
Node* _head; 
}; 
int main()
{
    List l;
    l.PushFront(1);
    l.PushBack(2);
    l.PushBack(3);
    l.PushBack(4);
    l.PushBack(5);
    l.PushBack(6);
    List l1;
    l1=l;
    l.Print();
    l1.Print();
    l.PushFront(0);
    l.Print();
    l.PopBack();
    l.Print();
    l.PopFront();
    l.Print();
    ListNode *ret = l.Find(3);
    cout<<ret->_data<<endl;
    cout<<ret->_next->_data<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_40331034/article/details/80003059