データ構造(1)シーケンステーブルc++テンプレート実装
以前のコードを整理して、一部の内容がネット上を参考にしていることを覚えています.一般的なデータ構造とアルゴリズムが上書きされます.
ちくじひょう
1.シーケンステーブルの定義(1)シーケンス格納方法とは、線形テーブルのノードを論理順に一組のアドレスが連続するメモリセルに順次格納する方法である.(2)シーケンステーブル(Sequential List)シーケンス格納方式で格納されるリニアテーブルをシーケンステーブル(Sequential List)と略す.2.ノードaiの記憶アドレスは一般性を失わず、線形テーブル内のすべてのノードのタイプが同じであるとすれば、各ノードが占有する記憶空間の大きさも同じである.表中の各ノードがc個のメモリセルを占有すると仮定し、第1のセルのメモリアドレスがそのノードのメモリアドレスであり、表中の開始ノードa 1のメモリアドレス(ベースアドレスと略称する)がLOC(a 1)であるとし、したがって、ノードaiの記憶アドレスLOC(ai)は、以下の式で計算することができる:LOC(ai)=LOC(a 1)+(i−1)*c 1≦i≦n注意:シーケンステーブルにおいて、各ノードaiの記憶アドレスは、テーブル内のノードの位置iの線形関数である.ベースアドレスと各ノードのサイズが分かれば、同じ時間に任意のノードの記憶アドレスを求めることができる.ランダムアクセス構造です.
表現形式は配列であり,ここでは主に挿入,削除,クエリーなどの基本操作を実現する.
ちくじひょう
1.シーケンステーブルの定義(1)シーケンス格納方法とは、線形テーブルのノードを論理順に一組のアドレスが連続するメモリセルに順次格納する方法である.(2)シーケンステーブル(Sequential List)シーケンス格納方式で格納されるリニアテーブルをシーケンステーブル(Sequential List)と略す.2.ノードaiの記憶アドレスは一般性を失わず、線形テーブル内のすべてのノードのタイプが同じであるとすれば、各ノードが占有する記憶空間の大きさも同じである.表中の各ノードがc個のメモリセルを占有すると仮定し、第1のセルのメモリアドレスがそのノードのメモリアドレスであり、表中の開始ノードa 1のメモリアドレス(ベースアドレスと略称する)がLOC(a 1)であるとし、したがって、ノードaiの記憶アドレスLOC(ai)は、以下の式で計算することができる:LOC(ai)=LOC(a 1)+(i−1)*c 1≦i≦n注意:シーケンステーブルにおいて、各ノードaiの記憶アドレスは、テーブル内のノードの位置iの線形関数である.ベースアドレスと各ノードのサイズが分かれば、同じ時間に任意のノードの記憶アドレスを求めることができる.ランダムアクセス構造です.
表現形式は配列であり,ここでは主に挿入,削除,クエリーなどの基本操作を実現する.
#include <iostream>
using namespace std;
const int DefaultSize = 10;
template <typename T> class SeqList
{
private:
T *m_elements; //
int m_nCurrentsize;//
int m_nMaxsize;//
public:
SeqList(int size=DefaultSize):m_nMaxsize(size),m_nCurrentsize(0)//
{
cout<<"constructor called"<<endl;
if (size>-1)
{
m_elements=new T[m_nMaxsize];
}
};
~SeqList()
{
cout<<"destructor called"<<endl;
delete []m_elements;
};
SeqList(const SeqList& SL):m_nCurrentsize(SL.m_nCurrentsize),m_nMaxsize(SL.m_nMaxsize)//
{
m_elements = new T[m_nMaxsize];
memcpy(m_elements,SL.m_elements,m_nMaxsize);
cout<<"copying constructor called"<<endl;
};
SeqList& operator=(const SeqList& SL) //
{
cout<<"= called"<<endl;
if (this==&SL) return *this;
m_nCurrentsize=SL.m_nCurrentsize;
m_nMaxsize=SL.m_nMaxsize;
delete []m_elements;
m_elements=new T[m_nMaxsize];
memcpy(m_elements,SL.m_elements,m_nMaxsize);
return *this;
};
bool IsEmpty() const;// ,
bool IsFull() const;//
int Length() const;//
int Find(T seq_x);// seq_x,
int IsElement(T seq_x);// seq_x
int Insert(T seq_x, int pos);// pos
int Remove(int pos);// pos
void print(void);
T GetElement(int pos) const;// pos
};
template <typename T> bool SeqList<T>::IsEmpty() const
{
cout<<(0==m_nCurrentsize)<<endl;
return (0==m_nCurrentsize);
}
template <typename T> bool SeqList<T>::IsFull() const
{
cout<<(m_nCurrentsize==m_nMaxsize)<<endl;
return (m_nCurrentsize==m_nMaxsize);
}
template <typename T> int SeqList<T>::Length() const
{
cout<<m_nCurrentsize<<endl;
return m_nCurrentsize;
}
template <typename T> int SeqList<T>::Find(T seq_x)
{
for(int i=0;i<m_nCurrentsize;i++)
{if(m_elements[i] == seq_x)
{cout<<i<<endl;
return 1;}
}
return -1;
}
template <typename T> int SeqList<T>::IsElement(T seq_x)
{
if (-1 == Find(seq_x))
return -1;
return 1;
}
template <typename T> T SeqList<T>::GetElement(int pos)const
{
if(pos<0 || pos>=m_nMaxsize)
{cout<<"illegel operate!"<<endl;
return -1;}
return m_elements[pos];
}
template <typename T> int SeqList<T>::Insert(T seq_x,int pos)
{
if(pos<0 || (pos>m_nCurrentsize) ||(m_nCurrentsize >= m_nMaxsize))
{cout<<"illegel operate!"<<endl;
return 0;}
for(int i=m_nCurrentsize;i>pos;--i)
m_elements[i]=m_elements[i-1];// ,
m_elements[pos]=seq_x;
++m_nCurrentsize;
return 1;
}
template <typename T> int SeqList<T>::Remove(int pos)
{
if(pos<0 || (pos>m_nCurrentsize))
{cout<<"illegel operate!"<<endl;
return 0;}
for(int i=pos;i<m_nCurrentsize-1;++i)
m_elements[i]=m_elements[i+1];
--m_nCurrentsize;
return 1;
}
template <typename T> void SeqList<T>::print()
{
for(int i=0;i<m_nCurrentsize;i++)
cout<<m_elements[i]<<endl;
}
int _tmain(int argc, _TCHAR* argv[])//
{
SeqList<int> seq1;
int array[10]={2,5,8,1,9,9,7,6,4,20};
for(int i=0;i<10;i++)
seq1.Insert(array[i],0);
seq1.print();
seq1.Length();
seq1.IsFull();
seq1.Find(7);
//seq1.IsElement(7);
int b=seq1.GetElement(1);
cout<<b<<endl<<endl;
seq1.Remove(1);
seq1.print();
cout<<endl;
seq1.Remove(8);
seq1.print();
return 0;
}