C++リニアテーブルを実現するシーケンステーブル

2603 ワード

//List.cpp:コンソールアプリケーションのエントリポイントを定義します.#include "stdafx.h"#includeusing namespace std;/**リニア・テーブルのC++抽象クラス宣言*/template class List{public:virtual void clear()=0;//virtual bool insert(const Elem&)=0;//virtual bool append(const Elem&)=0を挿入//リニア・テーブルの末尾に追加virtual bool remove(const Elem&)=0;//エレメントvirtual void setStart()=0;//ヘッダvirtual void setEnd()を設定 = 0;//表末尾virtual void prev()=0;//1つの要素の前駆virtual void next()=0を求めます;//1つの要素の後継virtual int leftLength()=0を求めます;//フェンスの左側の要素の長さを求めますvirtual int rightLength()=0;//フェンスの右の要素の長さvirtual bool setPos(int pos)=0を求めます;//線形テーブル内の要素の位置を決定virtual bool getValue(Elem&)const=0;//要素のパラメータ値virtual void print()=0を求めます;//印刷};template//シーケンステーブルの実装class AList:public List{//ALListは抽象クラスListを継承するので、リストのすべてのメンバー関数private:int maxSize;//線形テーブルの最大記憶量int listSize;//線形テーブルの長さint fenceを宣言する//フェンスElem*listArrayを宣言する//シーケンステーブル要素を格納する配列public:AList(int size=DefaultListSize)を宣言する{//コンストラクション関数maxSize=size;listSize=fence=0;listArray=new Elem[maxSize];}~AList(){//構造関数delete[]listArray;}void clear(){delete[] listArray;listSize = fence = 0;liatArray = new Elem[maxSize];}bool insert(const Elem&);bool append(const Elem&);bool remove(Elem&);void setStart(){fence = 0;}void setEnd(){fence = listSize;}void prev(){if (fence != 0) fence--;}void next(){if (fence <= listSize) fence++;}int leftLength() const{return fence; }int rightLength() const{return listSize - fence;}bool setPos(int pos){if ((pos >= 0) && (pos <= listSize)) fence = pos;return (pos >= 0) && (pos <= listSize);}bool getValue(Elem & it){if (rightLength() == 0) return false;else{it = listArray[fence];return true}}void print() const{int temp = 0;cout << "< ";while (temp < fence) cout << listArray[temp++] << "";cout << "| ";while (temp < listSize) cout << listArray[temp++] << "";cout << ">";}};template bool AList::insert(const Elem&item){if(listSize==maxSize)return false;//線形表現が最大長になるとfor(int i=listSize;i>fence;i-)/表の最後からlistArray[i]=listArray[i-];//i-1の要素をi位listArray[fence]に移動 = item;//挿入する要素をfenceの位置listSize++に挿入します.return true;}template bool AList::append(const Elem&item){if(listSize==maxSize)return false;listArray[listSize+]=item;//追加する要素を表末尾return trueに追加する;}template bool AList::remove(Elem& item){if (rightLength == 0) return false;item = listArray[fence];for (int i = fence; i < listSize - 1; i++){listArray[i] = listArray[i + 1];listSize--;return true;}}int _tmain(int argc, _TCHAR* argv[]){AList aList;return 0;}