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