C+---簡単なリードサイクル双方向チェーンテーブルを実現

10764 ワード

C++シンプルなリードサイクル双方向チェーンテーブルを実現
先頭に立って双方向ループチェーンテーブルを聞くのは難しいようですが、実際には、その実現は比較的簡単で、前駆ノードと後継ノードが既知であり、ポインタを遍歴する必要もありません.   チェーンテーブルを構築するときは、ヘッダノードを初期化することを忘れないでください.また、前後のポインタを操作するときは、ポインタを保存して、これらのノードの関係を明らかにしなければなりません.そうしないと、いくつかのノードが失われます.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("
"
); } 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; }