1.動的シーケンステーブルの概要
1対1の関係を持つデータは、論理的に線形構造を構成し、線形テーブルによって論理的に表されます。
線形テーブルのコンセプトと特徴は、私は言葉ではありません。
線形テーブルの物理的なストレージは、シーケンシャルテーブル(連続スペースを占める)とリンクリストによって実現できます。
シーケンステーブルは、静的シーケンステーブルと動的シーケンステーブルに分けることができます。
静的シーケンステーブルは配列です。一度定義されると、サイズが固定されます。これは、配列名が多くの言語で定数であるためです。
動的シーケンステーブルは動的配列であり、適用されたスペースの最初のアドレスは、変更可能なポインター変数と共に格納されます。
2.動的シーケンステーブルをどのように表現するか
学生がC ++を学習した場合、C ++テンプレートクラスを選択して、データ構造の抽象データ型を表すことが最も適切です。
学生がC ++を学習していない場合、2つのオプションがあります
1つは、C言語の構造を使用して、ほとんどの教科書で選択されています。
1つは、C ++で構造テンプレートを使用することをお勧めします。
C言語の構造体で定義できるのはメンバー変数のみで、C ++の構造体ではメンバー変数とメンバー関数を定義できます。
C ++構造体は、一般的な型を処理するためのテンプレートの形を取ることもできます。
C ++構造の構文は、クラスの構文よりも単純です。
3、シーケンステーブルの簡単な実現
ここでは、動的シーケンステーブルの操作の一部を実装する抽象データ型としてC ++構造テンプレートを使用します。
初心者がコードのレベルからシーケンステーブルのアイデアを理解できるようにします。
#include<iostream>//C++的输入输出
using namespace std;
template<typename ElemType> struct SqList
{
ElemType *elem;//存储空间首地址
int length;//线性表中元素个数
int listsize;//当前线性表的最大容量
int InitList()
{//对顺序表进行初始化
elem=new ElemType[16];//这个正整数随便设置
if(0==elem)
return 0;
listsize=16;//初始时,有16个空间
length=0; //没有数据元素
}
int enlarge()
{//当L的空间不足时,本函数功能:将L的空间翻倍
//如果成功返回1,失败返回0
ElemType *newbase=new ElemType[listsize*2];
if(0==newbase)
return 0;
for(int i=0;i<length;i++)
newbase[i]=elem[i];
delete []elem;
elem=newbase;
listsize=listsize*2;
return 1;
}
int ListInsert(int i,ElemType x)
{//在顺序表的第i个位置插入元素x
//如果成功,返回1,否则返回0
if(i<0||i>length) return 0;
if(length==listsize)
{
int flag=enlarge();
if(flag==0)return 0;
}
int j;
for(j=length-1;j>=i;j--)
elem[j+1]=elem[j];
elem[i]=x;
length++;
return 1;
}
int pop_i(int i)
{//删除下标为 i 的数据
if(i<0 || i>=length)//如果删除位置不合法
return -1;
else
{
for(int j=i+1;j<=length-1;j++)
elem[j-1]=elem[j];//元素前移 一位
length--;
return 1;
}
}
int find(ElemType e)
{//在顺序表中查找元素e是否存在,
//如果存在返回对应的下标
//否则返回-1
for(int i=0;i<=length-1;i++)
{
if(elem[i]==e)
return i;
}
return -1;
}
void print()
{
for(int i=0;i<length;i++)
cout<<elem[i]<<" ";
cout<<endl;
}
};
int main()
{
SqList<int> LA;
LA.InitList();
for(int i=0;i<20;i++)
{
LA.ListInsert(i,i);
}
LA.print();
LA.pop_i(0);
LA.print();
cout<<LA.find(5)<<endl;
return 0;
}