2つのデータ構造を見直し:線形形式

EDITORIAL:我々は唯一の......私が行っていることが、試験離散データ構造だけでなく、7章を見直すために2日間チョンチョンチョンを持っています!

線形形式とは何ですか

それは以下のように定義される:N特性を構成するデータ要素の(> = 0)が同一の有限シーケンスのn = 0であり、空のリスト

空でない線形構造の特徴:

図1に示すように、「第一」は、単一要素

2、「最後」のユニークな要素

図3は、最初のものを除いて、データ構造の各データ要素は、前駆体であります

図4に示すように、最後の添加を除いて、各データ要素は、後継者であります

受注テーブル

名前が示すように、詳細に定義されていません。ストレージ構造のランダムアクセス特性。

動的に割り当てられた一次元アレイ(一般に示される)との配列表は、次の通り:

typedef struct{
    ElemType *elem;         //存储空间基地址
    int length;             //当前长度
}sqList;

動的に割り当てられた一次元アレイ(一例として単項次多項式記憶構造)との配列表、次のように

typedef struct{
    float coef;     //系数
    int expn;       //指数
}Polynomial;
typedef struct{
    Polynomial *elem;       //存储空间的基地址
    int length;             //多项式中当前项的个数
}sqList;

テーブルの基本的な操作を実現するために

図1に示すように、初期化

アルゴリズムはステップ:所定の空間的アレイに定義されたサイズに動的割り当てリストLをので、このアドレス空間ELEMポイントこと、テーブルセットの現在の長さを0に。

コードの実装:

L.elem=new ElemType[maxn];       //为顺序表分配一个大小为maxn的空间
if(!L.elem) exit(OVERFLOW);     //存储分配失败退出

特別な注意プログラムは、エクスポートに失敗しました!

図2に示すように、値

アルゴリズムは、ステップ:iが妥当である指定された位置番号の値を決定し、Iの妥当な値場合、対応するデータ要素L.elemは[I-1] E、それ以外の場合はエラーを介して、パラメータEにi番目のデータ要素の戻り値が割り当てられます。

注論理アルゴリズムのステップ!第1の判定実行後

コードはもはや与えられていません。

明らかに、時間計算量O(1)。

3.検索

コンテンツは、具体的には、詳細な説明の一部として将来になり見つけるアルゴリズムは、ここでは、唯一のトラバーサルの順序を見つけるために、時間計算量はO(N)です。

4、挿入

アルゴリズムのステップ:

図1は、それが正規位置Iか否かが判断されます

図2に示すように、それが正当なシーケンステーブル記憶か否かが判断されます

3、iを順次後方位置、空いたi番目の位置を移動させるにN番目の要素

最初の新しい要素すなわち位置に挿入される4、

5、長++

また、その論理アルゴリズムを注意してください!

コードは、以下の複雑さの分析時間を与えられていません。

I番目の要素の挿入事前確率であるP_ {I} = \ FRAC {1} {N + 1}回の携帯電話番号N-I + 1

テーブルに挿入される長さNの線形要素を移動させる時に、所望の値に必要な要素の数:だからE = \ FRAC {1} {N + 1} \ sum_ {I = 1} ^ {N + 1}(N-I + 1)= \ FRAC {N} {2}

平均時間計算量はO(N)であることをこれは示しています。

 

5、削除

アルゴリズムのステップ:

私は削除法的な位置かどうかを判断するために1、

図2に示すように、n番目の位置への素子のI + 1番目が順次前方に一つの位置を移動させます

3、length--

:上記の時間複雑分析E = \ FRAC {1} {N} \ sum_ {I = 1} ^ {N}(NI)= \ FRAC {N-1} {2}

リスト

チェーンメモリ構成、すなわち直線状のデータ要素記憶部は一連の任意の線形形状(連続または不連続)によって特徴付けられます

自身と直接後続の格納場所を含む情報を格納する、と呼ばれるデータフィールドポインタフィールドを

ポインタのリストに含まれるノードの数、及びポインタの接続へのポインタは、単一リンクリスト、円形のリンクリスト、二重リンクリスト、バイナリリスト、垂直リスト、隣接テーブル、隣接するマルチテーブル等に分けることができます。

単一のリストを定義し、表現

最初のノードは増加操作がより便利であり、時間の増加に添加することができます。

単一リンクリストのヘッドポインタを一意に非ランダムアクセス記憶構造コードは以下の通りである、決定することができます。

typedef struct LNode{
    ElemType data;              //结点的数据域
    struct LNode *next;         //结点的指针域
}LNode,*LinkList;               //LinkList为LNode的指针类型,定义时LNode *p与LinkList p完全相同

単一リンクリストの基本的な操作を実現

図1に示すように、初期化

L=new LNode;                //生成新结点作为i头节点,用头指针L指向头结点
L->next=NULL;               //头结点指针域置空

図2に示すように、値

P = P->次にトラバーサル操作、比較的単純な、詳細には説明しません。

平均の長さASL = \ FRAC {1} {N} \ sum_ {I = 1} ^ {n}は(I-1)= \ FRAC {N-1} {2}

時間計算量はO(N)です。

3.検索

また、時間の複雑同上をトラバーサル

4、挿入

キーコードは、比較的簡単で、主に場所を見つけて、新しいノードを作成することです挿入されます。

s->next=p->next;        //两个p->next可分别理解为一个有值的结点
p->next=s;             //一片待赋值的空间

5、削除

メインのコード:

q=p->next;
p->next=q->next;        //将待删除结点的前驱结点的后继指向待删除结点的后继
delete q;

 

6、単一のリストを作成します

ここでは、小さな焦点があります

前方の法律を実行し、単一のリストを作成します。

アルゴリズムのステップ:

ヘッドノードのみ空のリストを作成します。1.

2、N含むリストを作成するための要素の数、n回以下のサイクルに従って。

(1)は、p *新しいノードを生成します

(2)新しいノード値* p個のデータ・フィールドに割り当てられた入力要素

ヘッドノードに挿入新しいノードの後に​​(3)* P

コードの実装:

void CreateList_H(LinkList &L, int n)
{
    LinkList p;
    L = new LNode;
    L->next = NULL;
    for (int i = 0; i < n; i++)
    {
        p = new LNode;
        cin >> p->data;
        p->next = L->next;
        L->next = p;
    }
}

明らかに時間の複雑さはO(n)があります。

ここで最初からインサート要素実際のコードは、通常、補間によって書かれているように、各時間、元の配列の得られたリストは逆の順序、

あなたは、単一のリストの補間を作成した後

アルゴリズムのステップ:

ヘッドノードのみ空のリストを作成します。1.

図2に示すように、テール・ポインタrがヘッドノードを指すように初期化

3、Nの作成リストを含む要素の数に応じて、n回以下ループ

(1)は、p *新しいノードを生成します

(2)新しいノード値* p個のデータ・フィールドに割り当てられた入力要素

(3)新たなノードが尾に挿入された後に* P * Rノード

(4)新しいノードへのテール・ポインタの終わり* P

コードの実装:

void CreateList_R(LinkList &L, int n)
{
    LinkList r, p;
    L = new LNode;
    L->next = NULL;
    r = L;              
    for (int i = 0; i < n; i++)
    {
        p = new LNode;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
}

このようL Rで見られるように、外部のものは、それが直接、現在のポインタとして、理解することは困難であるように、ここでrは、最初に何かを置く場合は(実際には、コードがこのようなパフォーマンスです)、バックrは各工程Pです。

時間計算量はnです。

循環リスト

それが環を形成するために、第1のノード、全体リストに最後のノードテーブルポインタ視野点によって特徴付けられます。

終了条件pによってテーブルに現在のノードのポインタかどうかを決定!= NULLまたはP->次!= NULL Pになる!= LまたはP->次!= L.

時には唯一の循環リストの末尾ポインタを設定、これはリストのマージ操作を容易にします。

二重リンクリスト

2によって、ノード・ポインタ・フィールド、直接後継ポイント、別の点即時前身

ストレージ構造:

typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,*DuLinkList;

単一のリストで二重にリンクされたリストの挿入、両方向の削除含むポインタは、他の操作は非常に異なっていると、単一のリストには違いはありません

二重にリンクされたリストの挿入、メインコード:

s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;

単純に削除するには:

p->prior->next=p->next;
p->next->prior=p->prior;

これはO(N)の両方の時間複雑です。

シーケンステーブルとリストの比較

1、パフォーマンスのスペースを比較します

ベース割り当て比較的大きいの線状の長さの変化は、それがストレージのサイズを推定することは困難であり、リストは、ストレージ構造として使用されるべきメモリ記憶密度、サイズ

サイズが予め定めたときに直線状の長さの変化は、メモリ空間を節約するために、それはシーケンステーブル記憶構造として使用されるべきであり、容易ではない、逆に、

=データ記憶容量の記憶密度は、要素自体によって占められる:A /メモリの量は、ノード構造によって占め

2、演奏時間を比較します

メイン操作の値と前回のテーブル要素位置が密接に関連しているが、ほとんど挿入または削除操作を行うと効率をベースにしており、アクセス要素の挿入および削除の効率、このような動作は、シーケンステーブル記憶構造として採用されるべきです

逆に、最初の表頻繁に挿入または削除操作のために、リストは、ストレージ構造として使用されるべきです

 

 

 

-------------------------------------------------- -

 

注:この記事はすべてのコンテンツは、「データ構造(C言語第二版)」(ヤン魏ミン教師A)に由来しています

ディレクトリ

線形形式とは何ですか

受注テーブル

テーブルの基本的な操作を実現するために

図1に示すように、初期化

図2に示すように、値

3.検索

4、挿入

5、削除

リスト

単一のリストを定義し、表現

単一リンクリストの基本的な操作を実現

図1に示すように、初期化

図2に示すように、値

3.検索

4、挿入

5、削除

6、単一のリストを作成します

循環リスト

二重リンクリスト

シーケンステーブルとリストの比較

1、パフォーマンスのスペースを比較します

2、演奏時間を比較します


 

 

 

 

リリース6元記事 ウォンの賞賛0 ビュー138

おすすめ

転載: blog.csdn.net/Roy_F_M/article/details/103829508