DS004-構造テンプレート記述動的シーケンステーブル

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;
}

おすすめ

転載: blog.csdn.net/weixin_43917370/article/details/108416342