「データ構造とアルゴリズム」 - 線形テーブル順次記憶構造の挿入と削除

線形テーブルとは何ですか?

線形テーブルは、最も基本的かつ単純で、最も一般的に使用されるデータ構造です。線形リストはデータ構造の一種であり、線形リストは同じ特性を持つ n 個のデータ要素の有限シーケンスです。

線形テーブル内のデータ要素間の関係は 1 対 1 の関係です。つまり、最初と最後のデータ要素を除いて、他のデータ要素は端から端まで接続されています (子供たちが遊んでいる絵を想像していただけますか) 「鷲が鶏を捕まえる」、後ろの人の手が前の人の背中の角を掴む、このとき「鶏」の順番は直線表のようになる)

注: 上記は、すべての線形テーブルではなく、ほとんどの線形テーブルにのみ適用されます。

 

順次ストレージ構造の挿入と削除

1.要素を取得する

線形テーブルの順次ストレージ構造について、 GetElem操作      を実装する場合、つまり線形テーブルLi番目の位置要素の値を返す場合、それは実際には非常に簡単です。プログラムに関する限り、i の値が配列の添字の範囲内にある限り、配列の添字 i-1 の値を返すだけで十分です。

コードを見てください:

#define OK 1 
#define ERROR 0 
#define TRUE 1 
#define FALSE 0 


typedef int Status; 
/* Status是函数的类型,其值是函数结果状态代 码,如OK等 */ 
/* 初始条件:顺序线性表L已存在,1≤i≤ ListLength(L) */ 
/* 操作结果:用e返回L中第i个数据元素的值 */ 
Status GetElem(SqList L, int i, ElemType *e) 
{ 
    if (L.length == 0 || i < 1 || i > L.length) 
    return ERROR; 
    *e = L.data[i - 1]; 
    return OK; 
}

//注意这里返回值类型Status是一个整型,返回OK代表1,ERROR代表0

2. 挿入操作:

ListIn-sert( *L,i,e ) を実装したい場合、つまり、 線形リスト L i番目の位置に 新しい要素 eを挿入したい場合 、どのように操作すればよいでしょうか。
 
挿入アルゴリズムの考え方:
  • 挿入位置が不適切な場合は、例外がスローされます。
  • 線形テーブルの長さが配列の長さ以上の場合、例外がスローされるか、容量が動的に増加します。
  • 最後の要素からi 番目の位置まで順方向に移動し、それぞれ 1 つ前の位置に戻します。
  • 位置iに挿入する要素を入力しテーブルの長さに1を加えます
 
/* 初始条件:顺序线性表L已存在,1≤i≤ ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元 素e,L的长度加1 */
 Status ListInsert(SqList *L, int i, ElemType e) 
{
    int k; /* 顺序线性表已经满 */ 
    if (L->length == MAXSIZE)
        return ERROR; 

/* 当i不在范围内时 */ 
    if (i < 1 || i >L->length + 1) 
        return ERROR; 

/* 若插入数据位置不在表尾 */
    if (i <= L->length)
     { 
        /*将要插入位置后数据元素向后移动一位 */ 
        for (k = L->length - 1; k >= i - 1; k--) 
         
           L->data[k + 1] = L->data[k];
     
     }
       
         /* 将新元素插入 */ 
        
        L->data[i - 1] = e; 
        L->length++; 
        return OK; 

}
 

3.削除

アイデア :
  • 削除位置が不当な場合は例外がスローされます。
  • 要素を削除および削除します。
  • 削除された要素の位置から最後の要素の位置までの移動を開始し、それぞれ 1 位置ずつ前方に移動します。
  • テーブルの長さから1を減算します
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回 其值,L的长度减1 */

Status ListDelete(SqList *L, int i, ElemType *e)
 {
    int k; /* 线性表为空 */
    if (L->length == 0) 
    return ERROR;

/* 删除位置不正确 */ 
    if (i < 1 || i > L->length) 
    return ERROR;
    *e = L->data[i - 1];

 /* 如果删除不是最后位置 */
     if (i < L->length)
    { 
        /* 将删除位置后继元素前移 */ 
        for (k = i; k < L->length; k++)
        L->data[k - 1] = L->data[k];
     }

 L->length--; 
 return OK; 

}
    線形テーブルの逐次記憶構造では、データの格納および読み取りの場合、データがどこにあるかに関係なく、時間計算量は O(1) であり、 挿入または削除の場合、時間計算量は O(n)です これは、要素の数があまり 変わら。
 

 

線形テーブル順次ストレージ構造の長所と短所:

アドバンテージ:

  • テーブル内の要素間の論理関係を表すために追加の記憶域を追加する必要はありません。
  • テーブル内の任意の位置にある要素にすばやくアクセスできます

欠点:

  • 挿入および削除操作では、多数の要素を移動する必要があります
  • 線形テーブルの長さが大きく変化すると、格納スペースの容量を決定することが困難になります
  • ストレージスペースの「断片化」を引き起こす

 

 

おすすめ

転載: blog.csdn.net/qq_41899773/article/details/104860759