1. 程式人生 > >雙向迴圈連結串列(c++)

雙向迴圈連結串列(c++)

#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; }

這裡寫圖片描述