データ構造 - リニアフォーム
リニアテーブルのコンセプト
定義:同じ特性のデータ要素を有する有限のシーケンス。
要素の数は、直線状の長さと呼ばれるN(N≧0)で表され、そして場合nは0であり、線形テーブルを表す空のテーブルであります
1.論理特徴:線形構造
一対一のデータ要素間の関係の線形:線形構造の定義。
最初の要素(ヘッダ)がある場合①、最後の要素(フッタ)空のテーブル、最初/最後の要素が空であります
②最初の要素に加えて、他の要素は一意先行有する
最後の要素以外の、他の要素は、固有の後継を有します
2.ストレージ構造:シーケンス/チェーン
順次記憶構造は、(もちろん、アクセスのための)メモリ構造線形ランダムアクセステーブルである
テーブルの直鎖状構造の連結された記憶構造体が順次アクセス記憶されています。
(順番に格納されている)1.配列表:
(1)定義:リニアテーブルそれらの論理的な順序に従って、すべての要素が、順次、指定された記憶場所連続メモリ始動に格納されています
(2)特徴:
①ランダムアクセス
②連続した収納スペース、収納スペース、時間分布を占有
③インサート要素(可動要素⇒NIのi番目の要素のテーブル番号の後に挿入された)複数の移動します
④記憶密度= 1
2.リスト(チェーン店):
(1)定義:ストレージ・アドレス(追加のポインタフィールド)図を示すポインタによって接合素子との間の論理的関係。
単鎖前駆体ノードのアドレス情報は、後続ノードに含まれるような
(2)特徴:
①連続した収納スペース、時間を割り当てられたストレージスペースを占有しません
②(読まれるべき見つけて読み出すために、それに先行する要素のすべての要素を通過しなければならない)、のみシーケンシャルアクセスがランダムアクセスをサポートしていません
ポインタ・フィールドのための空間を残す必要があるため、②を
記憶スペースの利用率が低く、記憶密度<1であります
③メモリ空間のサポート動的割り当て(現在アクティブ分割)
④要素を移動させることなく、操作を挿入
3.ヘッドポインタヘッド:
①ポインタフィールドポインタは独立変数へのポインタではなく、ノードの単一のリンクされたリストであります
③ヘッドノードリストが必要ではないが、
しかしチェーン(非環状鎖)は、ヘッド・ポインタを持っている必要があり
、シーケンステーブルの最初の要素の位置は、ヘッド・ポインタを示すために使用することができます
唯一のヘッドは(先頭ポインタが必要とされていない)を示すために、円形リストポインタ/テールポインタすることができ
③ヘッドポインタがリストを識別する効果を有し、全体のリストは、名前リストヘッドポインタ標識(ポインタ変数の名前)、スクラッチから開始するポインタにアクセスする必要があります
④head->次に⇔(ヘッド*).next
(ヘッドノードポインタドメインメンバへのポインタ、次のノードの次の隣のノード⇒head->次の点に、すなわちヘッド・ポイント)
最初のノードがリストされている場合⑤関係なく、リストが空であるかどうかの、ヘッドポインタがヌルでありません。ヘッドポインタは、リストの重要な要素です。(最初の文、ヘッドノードへの無野生のポインタ)
シーケンステーブルポインタが空のシーケンステーブルが空であります
5つのフォームの4 Aリスト
リストは、同じ、単一のチェーンケースを使用し、リードとリード接合ノード間で区別することができません
1.シングルリスト
データフィールドに加えて、各ノードは、さらに次のノードを指すように次ポインタフィールドを含みます。(エンド)ノードテーブルテールポインタフィールドがNULLであります
シングルチェーン(1)最初のノード
ノードの単一のリンク・リスト中の鉛で、あいまいさを有する第一のノード
のノード要素の最初の要素とは、ノードを表し
、ノードのノードを表す(最初のノード/第一のリニアテーブル要素ノード)
①最初のノード(リストの長さが格納されていてもよいです)。最初のノードの範囲無し情報/メタデータポインタフィールドポイント
②ヘッドポインタヘッドストア最初のノードのメモリ位置(ヘッドノードに常に点)、ヘッド・ポインタが常に空でない(宣言ヘッドポインタではないが、最初のノードが、それは野生ポインタが空でない場合)
ポインタ指して、格納位置
③ヘッドノードの後続ノードは、第1のデータ要素ノードの開始を格納します
④head->次= NULL、リストは空です
(2)は、単一リンクリストのノードにつながりません
開始ノードとして最初(要素)ノード
頭がNULLの場合、リストが空である、開始ノードに直接向かいます
2.二重リンクリスト
これは、現在のノードの先行する前に、単一のリンクリストノード点にポインタフィールドを追加します
まだリードとリード接続ノード、及び同単鎖を区別しません
(通常は)ただのサイクルではなく、二重リンクリストポインタフィールド前駆体を添加し
、通常と同じ単鎖を空のテーブルを決定しました
3.サイクル単独リンクリスト
最後のフィールド単一リンクリストポインタ(テーブルポインタフィールド接合部の端部)は、最初のノードを指します。
ここで最初のノードが最初のノードを指す/最初の要素ノード
ループは依然としてヘッドノードない単一リンクリストのノードとリードとを区別することができるので
(2)決意テーブル空
ヘッドノードなし:
ヘッド= NULL
最初のノード:
ヘッド=頭部>次に
、第1のノードサイクル(シングル/デュアル)リストポインタがヌルでありません
4.円形二重リンク
(1)定義:
二重結合末端ノード(ノードフッタ)リンクされたリスト内の次のノードへの最初のポインタ
終端ノードへの最初のノードの前リストポインタに
識別可能な鉛非鉛接合ノード
(2)は、空のテーブルを決定する
ヘッドノードなし:
ヘッド= NULL
最初のノードは:
頭部>次に==頭部と頭部>前=ヘッド
への決意の
リード円形の二重リンクリストのノードポインタがヌルでありません
任意のノードの円形の二重にリンクされたリストではないヌルポインタ前駆
5.静的リスト
1次元配列により、リンクリストは、連続的なスペースを必要とします
アレイ内のノードコンポーネント後続ノードの位置に各ポインタ点
「ポインタ成分」:配列相対位置の次のノードに整数変数ポインティング
(最初のノードと同様に)最初のアイドル位置の配列の最初の要素にノード点
S [0] .CURノードは、第1の位置であります
ポインタを区別するに関連付けられたノードのリンクされたリスト
1.関係:ノード名ではないので、我々は、ノードの名前として名前Aへのポインタを使用するので、我々は、ノードAを指すポインタを定義します
①ノード②ノードへのポインタ:Aを意味
2.区別:
①ポイントはここで誰⇒Aポインタ指す
②freeを()は、本明細書A⇒Aを放出するノードを指す
ポインタ変数自体であるため、解放しないユーザの必要性をシステムによって割り当てられた記憶空間を必要としました。ユーザー自身に割り当てられたメモリ空間(メモリ空間のmalloc /ノード)は、独自のリリースを必要とします
リニアリスト構造定義されており、基本的な操作
I.構造が定義されています
1.オーダーテーブル
構造体{} Sqlistのtypedef(1)は 、
シーケンステーブル(構造)及びSqlistと呼ばれる変化のタイプを定義します
(アレイベースアドレスELEMの配列要素へのポインタによって)配列の要素の(2)メンバーINT * ELEM;
配列長とスペース長割当てサイズLISTSIZE
空のリスト1-2線形の初期化
//(SqList&L)初期状態は空の配列参照初期化
{
L.elem =(INT )はmalloc(LISTSIZEはsizeof(INT))を
//L.elem割り当てアレイポインタポイントに割り当てられたメモリへの
もし出る(オーバーフロー)(L.elem!); //メモリ割り当ての失敗(L.elemがNULL、終了プロセスとリターンOVERFLOWです)
L.length = 0;
L.listsize = LISTSIZE。
OKを返します。
}
2.単独リンクリスト
(1)のtypedef構造体lノード{} lノード、* LINKLIST;
lノードと呼ばれる変化の単一リンクリストノード(構造)とタイプを定義し、
そして、名前の変更、構造体lノード*(ノードポインタ)型LINKLIST
int型*(int型のポインタを)結合型の感謝
int型として理解されるべき*
LINKLIST L;定義する変数ノードポインタ型L
Lは、ポインタ変数の(点)は、ノードタイプである
全シーケンステーブルを識別する
(2)
ノードデータフィールドを含む(メンバー)intデータ
ポインタフィールド(メンバー)構造体lノード*次
構造自体が地域名ではないように、構造自体によって定義されている
次のノードへの次のポインタ
3.二重にリンクされたリスト
(1){}のtypedef構造体DLNode DLNode、* DuLinkList;
DLNode二重リンクリストのノードタイプ、
DuLinkList二重リンクリストノードポインタ型
(2)データ・フィールド・intデータ;
2ポインタフィールドの
前に構造体DLNode *、先行ノードポインタをポイントする
構造体DLNode *次、後継ノードポインタポインティング
2つの動作シーケンステーブル
1.検索アルゴリズムの要素値
満足の比較()要素rは、配列表のi番目の値を見つけるために
int型LocateElem(SqList L、Elemtype電子、ステータス(*比較)(Elemtype、Elemtype)){〜}
コールSqListのL(1)
のメモリ内のシーケンステーブルを変更しません
(2)関数ポインタ
ステータス(*比較)(int型、 int型)
ステータスの戻り値(タイプ)を比較するための関数ポインタポイント、int型のパラメータ(タイプ)、のInt関数
割当(呼び割り当て):LocateElem(L、E、COMP)
COMPはその定義の関数であり、ポインタは、比較するために指して、比較することによって呼び出すことができ
コール:比較(A、B)/(*比較)(a、b)は、
(3)配列値の最初の要素はELEMに格納されている[0] / * ELEM、(第1のアドレスアレイELEM ==&ELEM [0])
*要素⇒ビット配列とのELEMアクセス配列要素(1-N)
初期値として要素の// I順序値、1。
INT 1 = I。
++ Pを横断するためのテーブルに割り当て// pベースアドレス、注文テーブル
elemType L.elem = * P。
しばらく(I <= L.length &&(*比較)(* P ++、E)!)++ I;
IF(I <= L.length)Iを返します。
それ以外の戻り0;
}
3.挿入要素
ステータス挿入(SqList&L、int型 Iを、int型E)// eはi番目の位置の前に挿入され
、{
IFリターンエラー(iは+ L.length 1 <1 || I>。);
//最初(1〜Nであります挿入前1)位置
IF(L.length> = L.listsize)
{
elemType * newbase;
newbase =(int型*)のrealloc(L.elem、(+ L.listsize increament)*はsizeof(elemType));
出口(OVERFLOW IF(newbase!) );
//割り当ての失敗を防止するための決意を、追加、元の配列がさらに空にされます
L.elem=newbase;
L.listsize+=increament;
}
* P INT;
P =&L.elem [-I 1];
//要素の位置(アドレス変数の割り当て)を挿入
するための(INT * Q =&L.elem [-L.length 1。]; Q> = P、Q-)
// Qはテーブル要素位置の端部である
*(Q + 1)= * Q。
*p=e;
L.length++;
OKを返します。
}