データ構造-単一チェーンテーブル_c++
12930 ワード
**
ノード構造の定義:**
単一チェーンテーブルクラスの定義
**
3アルゴリズム設計と実装(クラスのメンバー関数実装)
**(1)デフォルトのコンストラクタ
(2)パラメトリックコンストラクタあり
(3)解析関数
(4)シングルチェーンテーブルの反転
(5)単鎖表の長さを求める
(6)ビット別検索
(7)値で検索
(8)挿入操作アルゴリズムの説明:1 i<1であれば挿入に失敗し、終了する;2単鎖テーブルをスキャンし、単鎖テーブルのi-1番目の要素ノードのポインタpを探す;3 pが存在する(pが空でない)場合はその後に挿入し、操作に成功し、そうでなければ挿入できない.
(9)削除操作a)アルゴリズムステップ:(単一チェーンテーブルのpos番目の要素を削除する)①pos<1であれば削除に失敗し、終了する;2単一チェーンテーブルのpos-1番目の要素ノードを探すポインタp;3 pとp->linkが空でなければ、p->linkが指すノードを削除し、そうでなければ削除に失敗する.
(10)チェーンテーブル全体の印刷
ノード構造の定義:**
templateT>
struct Node
{
T data;
Node * link;
Node(){Link=NULL;}
Node(T x,Node *next=NULL)
{ data=x; link=next; }
};
単一チェーンテーブルクラスの定義
template
class LinkList
{
Node * head;//
public:
LinkList();//
LinkList(T a[ ],int n);// n ( )
~LinkList();//
Node *invert(Node *x);//
int ListLength();//
T get(int pos);//
int Locate(T item);//
void PrintLinkList();//
bool Insert(int i,const T &item);//
bool Remove(int i,T&x);//
};
**
3アルゴリズム設計と実装(クラスのメンバー関数実装)
**(1)デフォルトのコンストラクタ
template<class T>
LinkList::LinkList() // 1
{ //
head=new Node;//
}
(2)パラメトリックコンストラクタあり
template<class T>
LinkList::LinkList(T a[],int n) // 2
{ //
Node *p,*r;
head=p=new Node;// ,p
for(int i=0;inew Node(data[i]);
p->link=r; // p
p=p->link; //p
}
}
(3)解析関数
template<class T>
LinkList::~LinkList() // , ,
{
Node *current=head->link; // current
while(current!=NULL) // ,
{
Node *r=current;
current=current->link;
delete r;
}
head->link =NULL; //
}
(4)シングルチェーンテーブルの反転
template
Node LinkList::*invert(Node *x)
{
Node *p,*q,*r;
p=x;
q=NULL;
while(p)
{
r=q;
q=p;
p=p->link;
q->link=r;
}
return q;
}
(5)単鎖表の長さを求める
template
int LinkList::ListLength()
{
int num=0;
Node *p=head->link;
while(P)
{
p=p->link;
num++;
}
return num;
}
(6)ビット別検索
template
T LinkList::Get(int pos)
{
Node *p=head->link;
j=1;
while(p&&j<pos)
{
p=p->link;
j++;
}
if(!p||j>pos)
{
cout<<" "<exit(1);
}
else
return p->data;
}
(7)値で検索
template<classT>
int LinkList<T>::Locate(T item)
{
Node<T>*p=head->link;
int j=1;
while(p&&p->data!=item)
{
p=p->link;
j++;
}
if(p) return j;
else return 0;
}
(8)挿入操作アルゴリズムの説明:1 i<1であれば挿入に失敗し、終了する;2単鎖テーブルをスキャンし、単鎖テーブルのi-1番目の要素ノードのポインタpを探す;3 pが存在する(pが空でない)場合はその後に挿入し、操作に成功し、そうでなければ挿入できない.
template<class T>
bool LinkList<T>::Insert(int i,const T&item)
{ // i item, true, false。
if(i<1) //
return false;
Node<T> *s,*p=head;
int count=0; // count
while(p && count<i-1)// i-1 front
{
p=p->link;
count++;
}
if(!p) //
return false;
s=new Node<T>(item,p->link);
s->data=item;
s->link= p->link;// (s ) link (s->link)
p->link=s; // (p->link)
return true;
}
(9)削除操作a)アルゴリズムステップ:(単一チェーンテーブルのpos番目の要素を削除する)①pos<1であれば削除に失敗し、終了する;2単一チェーンテーブルのpos-1番目の要素ノードを探すポインタp;3 pとp->linkが空でなければ、p->linkが指すノードを削除し、そうでなければ削除に失敗する.
template<classT>
bool LinkList<T>::Remove(int i,T&x) // i , x
{
if(i<1) //
return false;
Node<T> *current,*p=head;
int count=0;// count
while(p->link && count<i-1)// i-1
{
p=p->link;
count++;
}
if(!p->link) // ,pos
return false;
current=p->link; // current
p->link=current->link; //
x= current->data;
delete current;
return true;
}
(10)チェーンテーブル全体の印刷
template<class T>
void LinkList<T>::PrintLinkList()
{
Node<T>*current = head->link;
while(current)
{
cout<<current->data<<" ";
current=current->link;
}
cout<<endl;
}