リニアテーブル(シーケンシャルストレージ)

1.特徴

これは、データ要素間の唯一の前任者と後継者の関係を持っています。

2.論理構造

2.1論理構造図。

シーケンステーブルの論理構造

2.2抽象データ型の定義

リニアテーブルは、実質的に完全なアクセスが、挿入および削除操作を必要とします。抽象データ型の定義は次のとおりです

ADT List
	DataModel
		线性表中元素具有相同类型,相邻元素具有前驱和后继关系
	Operation
		InitList
			输入:无
			功能:线性表的初始化
			输出:空的线性表
		CreatList
			输入:n个数据元素
   			功能:建立一个线性表
   			输出:具有n个元素的线性表
		DestroyList
   			输入:无
      			功能:销毁数据表      			
      			输出:释放线性表的存储空间
      		PrintList
      			输入:无
      			功能:遍历操作,按序号一次输出线性表中的元素
      			输出:线性表的各个数据元素
      		Length
      			输入:无
      			功能:求线性表的长度
      			输出:线性表中数据元素的个数
      		Locate
      			输入:数据元素x
      			功能:按值查找,在线性表中查找值等于x的元素
      			输出:如果查找成功,返回元素x在线性表中的序号,否则返回0
      		Get
      			输入:元素的符号i
      			功能:按位查找,在线性表中查找序号为i的数据元素
      			输出:如果查找成功,返回序号为i的元素值,否则返回查找失败信息
      		Insert
      			输入:插入位置i和待查元素x
      			功能:插入操作,在线性表的第i个位置插入一个新元素x
      			输出:如果插入成功,返回
		Delete
			输入:删除位置i
			功能:删除操作,删除线性表中的第i个元素
			输出:如果删除成功,返回被删元素,否则返回删除失败信息
		Empty
			输入:无
			功能:判空操作,判断线性表是否为空表
			输出:如果是空表,返回1,否则返回0
endADT		

1.入力出力2. 3.機能:操作は3つの部分で構成さ

2.3と順次記憶構造を達成するために

2.3.1ストレージ構造定義

一次元配列は、配列表を使用して実装、注文テーブル要素の位置は、配列インデックスによって得ることができます。そして、配列を使用して、我々は、メモリ内の固定長の配列のためのスペースを割り当てる必要があります。MaxSizeによって配列の長さを表し、長さの直線状の長さを表します。一方、シーケンステーブルで定義された間私達の範囲の配列は、配列の長さ、すなわち、MaxSizeの特定の長さよりも長いシーケンステーブルの長さよりも大きくなければならないです。
建物は今そこにあるとしてのみ我々は(定義された配列)を使用することができますこのフロア「家」ので、私たちは、今ダウン購入する層のうちの一つです。1-10この10階建ての「家」をしていると仮定すると、これは私たちのMaxSizeは、10で、「家の数」です。
今、私たちは、これらの10「家」を使用することができ、私たちは家の数は長さと呼ばれる周り、(テーブルの要素の順序)、「ホーム」と呼ばれる私たちの「家」、私は「家」を使用する方法に関係なく使用することができます数が、MAXSIZEの長さよりも大きくなければなりません範囲「家」の数のうちになることはありません。

そして、テーブルの線形配列の長さが異なる意味を持ちます:
そしてテーブルの線形配列の長さは、異なる意味を有します

次の表の順序定義されたストレージ構造を与えます:

#define Maxsize 100	//假设顺序表最多存放100个元素
typedef int DataType;	//定义线性表的数据类型,假设为int型
typedef struct
{
 DataType data[Maxsize];	//存放数据元素的数组
 int length;	//线性表的长度
} SeqList;

2.3.2達成

すでに述べたように、「操作は3つの部分から構成:1.入力出力2. 3.機能」、
我々はユーザーインターフェースを作るとき、我々はまた、三つの部分を考慮する必要があります:
1.かどうかは、有効な入力
方法機能2.
に従って正当性と機能入力の結果が出力を決定します

(1)初期化シーケンステーブル

いわゆる初期化、事は線形テーブルため、元の状態に復元することである、すなわち、すべての要素は、空のテーブルのテーブル構造を残して、除去されます。私たちは、シーケンステーブルのすべての要素の影響が削除され、原因となることができ、シーケンステーブル長の長さが0に初期化され、元の要素内部の注文表は、(配列の事実が存在して)使用されることはありません入れて、それは、初期化が完了しています。

すなわち、0に初期化のみテーブルの初期化シーケンスの長さ長順序テーブルは、C言語では、以下のように

void InitList(SeqList *L)
{
 L->length=0;
}

(2)確立シーケンステーブル

テーブルの順序を確立し、私たちは(テーブルの長さのシーケンスを設定することを忘れないでください)テーブルに配列内の要素の順序を割り当てる必要があります。
:すなわち、配列表の確立は4つのステップが必要であり、
1は入力の正当性を決定する、戻り0を支配されていない。
2.注文フォームに割り当てられた配列の要素;
3.シーケンステーブルの長さ;
4.正常に確立され、リターン1。

図配列表の動作シーケンスを確立します。

図のシーケンステーブルの動作シーケンスを確立します。

int CreatList(SeqList *L,DataType a[],int n)
{
 if(n>Maxsize)		//1.判断输入合法性,不合法则返回0
 {
  printf("顺序表空间不够,无法建立顺序表\n");
  return 0;
 }
 for(int i = 0;i<n;i++)		//2.把数组中的元素赋给顺序表
  L->data[i]=a[i];
 L->length=n;		//3.设置顺序表长度
 return 1;	//4.建立成功,返回1
}

(3)破壊シーケンステーブル

注文テーブルはスタティックメモリの割り当てで、自動的に、従って、範囲外テーブル変数に順次テーブルの破壊を注文する必要が可変メモリユニットシェアを解放しません。

(4)ノーオペレーション決意

何ら操作判定シーケンステーブルは、所定の長さの長さは、それが0であれば次のように、それは、シーケンステーブルが空であることをC言語を意味し、ゼロではありません。

int Empty(SeqList *L)
{
 if(L->length==0)
  return 1;	//顺序表为空返回1
 else return 0;
}

長さ(5)シーケンステーブルを探します

線状の長さとして記憶されている構造部材の長さのオーダーテーブルによって定義されたストレージ構造において、次のようにこのように、リニアテーブルの長さは、単に、C言語部材の長さの値を返します。

int Length(SeqList *L)
{
 return L->length;
}

(6)トラバーサル

シーケンステーブルで、標準トラバーサル操作次のように、両方のプレス要素が順次出力、C言語です。

void PrintList(SeqList *L)
{
 for(int i=0;i<L->length;i++)
  printf("%d ",L->data[i]);	//输出线性表的元素值,假设为int型
}

(7)の値で検索

そうでなければ検索失敗し、順序テーブルの値によりシーク動作達成するには、順次、テーブル内の順序素子に必要であり、検索が成功した場合、リターン要素数(屈折率差は、添字のシーケンス番号と配列要素1でありません)ロゴ0。

int Locate(SeqList *L,DataType x)
{
 for(int i=0;i<L->length;i++)
  if(L->data[i]==x)
   return i+1;		//返回序号
 return 0;	//退出循环,说明查找失败
}

(8)位置で検索

配列要素に格納されているi番目の配列表I-1の位置を添字。戻り値は(成功0 =失敗した、1)成功を示す機能リターンを得ます。検索が成功すると、以下のように、見つかった要素のポインタパラメータ値、C言語を返します。

int Get(SeqList *L,int i,DataType *ptr)
{
 if(i<i||i>L->length)
 {
  printf("查找位置非法,查找失败\n");
  return 0;
 }
 else
 {
  *ptr=L->data[i-1];
  return 1;
 }
}

(9)インサート

挿入前:
前の挿入
挿入した後に:
挿入後
i番目のテーブル(1 <= I <= N + 1) 新たな要素xの挿入番目、nはテーブルの長さは、n + 1リニアテーブルの直線長さとなります。
それは最後の要素から移動しなければなりません。
方法実施の5つのステップがある
テーブルがいっぱいである場合、オーバーフロー出力エラーメッセージは、挿入が失敗1.;
2.要素の挿入位置が無理であれば、位置誤差情報が出力され、挿入が失敗し、
3の最後の要素まで私要素が後退された1つの位置、
4要素X充填位置I;
5.表長さプラス1。

int Insert(SeqList *L,int i,DataType x)
{
 if(L->length>=Maxsize)	//1.如果表满了,则输出上溢错误信息,插入失败;
 {
  printf("上溢错误,插入失败\n");
  return 0;
 }
 if(i<1||i>L->length)	//2.如果元素的插入位置不合理,则输出位置错误信息,插入失败;
 {
  printf("位置错误,插入失败");
  return 0;
 }
 //j表示元素序号
 for(int j=L->length;j>=i;j--)	//3.将最后一个元素直至第i个元素分别向后移动一个位置;
  L->data[j]=L->data[j-1];
 L->data[i-1]=x;	//4.将元素x填入位置i处;
 L->length++;	//5.表长加1;
 return 1;
}

(10)削除

:削除する前に
削除する前に、
削除:
削除した後、
i番目の表(1 <= iが<= N ) の要素は、n-1リニアテーブルの長さに長さNの線形テーブルを削除します。
+ 1つの要素は、私から移動を開始しなければならない、および(削除がエラーで発生したときに可能であるようにごみ箱の効果として、)消去された要素を削除します。
方法実施の5つのステップがある
。1.テーブルが空のオーバーフローがある場合、エラーメッセージを出力し、削除に失敗しました。
要素の位置が不当削除する場合2.、位置誤差情報が出力され、削除が失敗した;
3.削除された位置にある要素I;
4最後の要素へのI + 1番目の要素が前方に移動された1つの位置、
前記テーブルの長さから1を引きました。

int Delete(SeqList *L,int i,DataType *ptr)
{
 if(L->length==0)	//1.如果表空,则输出下溢错误信息,删除失败;
 {
  printf("下溢错误,删除失败\n");
   return 0;
 }
 if(i<1||i>L->length)	//2.如果元素的删除位置不合理,则输出位置错误信息,删除失败;
 {
  printf("位置错误,删除失败\n");
  return 0;
 }
 *ptr = L->data[i-1];	//3.取出位置i的元素;
  //j表示元素序号
 for(int j=i;j<L->length;j++)	//4.将i+1个元素直至最后一个元素分别向前移动一个位置;
  L->data[j-1]=L->data[j];
 L->length--;	//5.表长减1;
 return 1;
}
公開された12元の記事 ウォンの賞賛2 ビュー524

おすすめ

転載: blog.csdn.net/qq_45582319/article/details/101605776