【C++データ構造学習ノート---リニアテーブル】先頭ノードの双方向ループチェーンテーブル
【C++データ構造学習ノート---リニアテーブル】先頭ノードの双方向ループチェーンテーブル
単純な実装例では,挿入関数および出力関数のみを用いて26文字の英字を初期化した.
挿入アルゴリズムの考え方:(insert)本アルゴリズムはノード後挿入
1、ノードpがヘッダノードを指すことを宣言し、iを0から初期化する.
2、チェーンテーブルを遍歴し、ポインタpを要素を挿入するノード、すなわちk回後方に移動させる.
4、ポインタqをpの右側のノードに向ける.
5、システムに新しいノードsを作成する.
次に、画像の考え方に従ってノードを挿入します.
削除アルゴリズムの考え方:(erase)本アルゴリズムはk番目のノードを削除する
1、ノードpがチェーンテーブルの最初のノードを指すことを宣言し、iを0から初期化する.
2、チェーンテーブルを巡回し、ポインタpを後方に移動させ、ノードを削除する前のノード、すなわちk-1回後方に移動させる.
3、ポインタqをpの右側のノードに向ける.
4、q=p->rightを実行する.p->right=q->right; q->right->left=q;ノードを削除します.
単純な実装例では,挿入関数および出力関数のみを用いて26文字の英字を初期化した.
挿入アルゴリズムの考え方:(insert)本アルゴリズムはノード後挿入
1、ノードpがヘッダノードを指すことを宣言し、iを0から初期化する.
2、チェーンテーブルを遍歴し、ポインタpを要素を挿入するノード、すなわちk回後方に移動させる.
4、ポインタqをpの右側のノードに向ける.
5、システムに新しいノードsを作成する.
次に、画像の考え方に従ってノードを挿入します.
削除アルゴリズムの考え方:(erase)本アルゴリズムはk番目のノードを削除する
1、ノードpがチェーンテーブルの最初のノードを指すことを宣言し、iを0から初期化する.
2、チェーンテーブルを巡回し、ポインタpを後方に移動させ、ノードを削除する前のノード、すなわちk-1回後方に移動させる.
3、ポインタqをpの右側のノードに向ける.
4、q=p->rightを実行する.p->right=q->right; q->right->left=q;ノードを削除します.
#include
using namespace std;
template
class List;
template
class Node{
friend class List;
private:
T data;
Node *left,*right;
};
template
class List{
public:
List(); //
~List(); //
bool empty()const{return header->right==header->left;}//
int size()const; //
bool retrieve(int k,T& x)const; // k x
int locate(const T& x)const; // x
List& insert(int k,const T& x); // k x
List& erase(int k); // k
void print_list()const; //
private:
Node *header;
};
template
List::List()
{
Node *p=new Node;
header=p->left=p->right=p;
}
template
List::~List()
{
Node *p=0,*q=0;
p=header->right;
while(header->right==header->left){
q=p->right;
header->right=q;
q->left=header;
delete p;
p=q;
}
delete header;
}
template
int List::size()const
{
Node *p=header->right;
int len=0;
while(p!=header){
p=p->right;
++len;
}
return len;
}
template
bool List::retrieve(int k,T& x)const
{
Node *p=header->right;
int i=0;
while(iright;
++i;
}
x=p->data;
return true;
}
template
int List::locate(const T& x)const
{
Node *p=header->right;
int i=1;
while((p!=header)){
if (p->data==x) return i;
p=p->right;
++i;
}
return 0;
}
template
List& List::insert(int k,const T& x)
{
Node *p=0,*q=0;
p=header;
int i=0;
while(iright;
++i;
}
q=p->right;
Node *s=new Node;
s->data=x;
s->right=p->right;
s->left=q->left;
p->right=s;
q->left=s;
return *this;
}
template
List& List::erase(int k)
{
Node *p=0,*q=0;
p=header;
int i=0;
while(iright;
++i;
}
q=p->right;
p->right=q->right;
q->right->left=q;
delete q;
return *this;
}
template
void List::print_list()const
{
Node *p=header->right;
while(p!=header){
cout <data <right;
}
}
int main()
{
int s1,s2;
s1='A';
s2='Z';
List p;
for(int i=s2; i>=s1; --i){
p.insert(0,i);
}
p.print_list();
return 0;
}