您的位置:首页 > 编程语言 > C语言/C++

C++实现双向链表

2017-11-15 22:05 429 查看
#pragma once
typedef int DataType;

struct ListNode

{

 ListNode* _next;

 ListNode* _prev;

 DataType _data;
 ListNode(const DataType& x)

  :_data(x)

  ,_next(NULL)

  ,_prev(NULL)

 {}

};
class List

{

 typedef ListNode Node;

public:

 List()

  :_head(NULL)

  ,_tail(NULL)

 {}

 List(const List& l)

  :_head(NULL)

  ,_tail(NULL)

 {

  Node* cur = l._head;

  while (cur)

  {

   PushBack(cur->_data);

   cur = cur->_next;

  }

 }
 List& operator=(List l)

 {

  swap(_head, l._head);

  swap(_tail, l._tail);

 }
 void Clear()

 {

  Node* cur = _head;

  while (cur)

  {

   Node* next = cur->_next;

   delete cur;

   cur = next;

  }
  _head = _tail = NULL;

 }
 ~List()

 {

  Clear();

 }
 void PushBack(const DataType& x)

 {

  if (_tail == NULL)

  {

   _head = _tail = new Node(x);

  }

  else

  {

   Node* tmp = new Node(x);

   _tail->_next = tmp;

   tmp->_prev = _tail;
   _tail = tmp;

  }

 }
 void PopBack()

 {

  Erase(_tail);

 }
 void PushFront(const DataType& x)

 {

  Insert(_head, x);

 }
 void PopFront()

 {

  Erase(_head);

 }

 void Insert(Node* pos, const DataType& x)

 {

  Node* tmp = new Node(x);

  if (_head == pos)

  {

   if(_head == NULL)

   {

    _head = _tail = tmp;

   }

   else

   {

    tmp->_next = _head;

    _head->_prev = tmp;

    _head = tmp;

   }

  }

  else

  {

   Node* prev = pos->_prev;

   prev->_next = tmp;

   tmp->_prev = prev;
   tmp->_next = pos;

   pos->_prev = tmp;

  }

 }
 void Erase(Node* pos)

 {

  if (_head == _tail)

  {

   assert(_head == pos);

   _head = _tail = NULL;

  }

  else if (pos == _head)

  {

   _head = _head->_next;

   _head->_prev = NULL;

  }

  else if (pos == _tail)

  {

   _tail = _tail->_prev;

   _tail->_next = NULL;

  }

  else

  {

   Node* prev = pos->_prev;

   Node* next = pos->_next;

   prev->_next = next;

   next->_prev = prev;

  }
  delete pos;

 }
 Node* Find(const DataType& x)

 {

  Node* cur = _head;

  while (cur)

  {

   if (cur->_data == x)

   {

    return cur;

   }
   cur = cur->_next;

  }
  return NULL;

 }
 void Print()

 {

  Node* cur = _head;

  while (cur)

  {

   cout<<cur->_data<<" ";

   cur = cur->_next;

  }

  cout<<endl;

 }
 void Reverse()

 {

  Node* cur = _head;

  while(cur)

  {

   swap(cur->_next, cur->_prev);

   cur = cur->_prev;

  }
  swap(_head, _tail);

 }
private:

 Node* _head;

 Node* _tail;

};

void TestList()

{

 List l1;

 l1.PushBack(1);

 l1.PushBack(2);

 l1.PushBack(3);

 l1.PushBack(4);

 l1.Print();
 ListNode* pos = l1.Find(3);

 l1.Insert(pos, 30);

 pos = l1.Find(3);

 l1.Erase(pos);

 l1.Print();
 l1.PopBack();

 l1.PopBack();

 l1.PopBack();

 l1.PopBack();

 l1.Print();

}

void TestList1()

{

 List l1;

 l1.PushBack(1);

 l1.PushBack(2);

 l1.PushBack(3);

 l1.PushBack(4);

 l1.Print();
 l1.Reverse();
 l1.Print();
 List l2(l1);

 l2.Print();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: