表2リニア

電源を入れます。https://blog.csdn.net/csdn_aiyang/article/details/84863136

セクション1:リニアフォーム

1.1コンセプト
テーブルリニア空でない有限集合で特徴付け単純な線形構造であり、第1の要素が直接的な前駆体要素を有していない、最後の要素が直接的な後継要素を有していない、他の要素は一意先行および後続要素を有しています。順次記憶テーブル線形構造とチェーン・ストレージ構造を有しています。

1.2順次記憶構造は、
この方法は、一般的配列と呼ばれるテーブルに格納されたリニアテーブルであり、順次連続するアドレス記憶部のそれぞれのグループに格納されているリニアテーブル要素を指します。

m個の記憶装置の線状の各要素が占有されるために、仮定、及び格納場所は、データ要素によって占められるように、第1ユニットのアドレスを格納します。リニア表I +位置の関係を満たす(+ 1 AI)=位置の場所に格納され記憶された位置との間の位置(AI)+ M 1つの位置要素(+ 1 AI)とi番目の要素(AI)。第1の素子A1のi番目の記憶位置における線状要素のテーブルの格納位置は、以下の関係を満たす、位置は(AI)=位置(A1)+(I-1)* M。前記第1の素子位置(A1)の位置は、開始アドレスやグループアドレスと呼ばれます。

シーケンステーブルの論理的に隣接する要素は、物理的に隣接しています。位置は線形で各データ要素を記憶し、テーブルの開始位置は、ビット線および配列表のデータ要素に比例する定数によって異なります。長い最初の要素の開始位置の決意として、テーブルの任意の要素は、ランダムアクセス線形とすることができるように、従って、順序テーブル記憶構造は、ランダム・アクセス・メモリの線形構造です。特別を有するランダムアクセスメモリのC言語配列ので、配列表の配列のように使用について説明します。次のとおりです。

{typedefは構造体
、データ型リスト[LISTSIZE]
; INT長
SeqList;}
、DATETYPEは、データ要素のタイプ、線形形式のデータ要素を格納するためのリストを表し、リニアテーブルの長さは、データ要素の数を表し、SeqList構造ボディタイプ名。コードテーブルの配列を定義:SeqList L;配列表へのポインタ:SeqList * L。

次の表の操作の基本的な手順:

(1)初期の線形形式:

InitListボイド(SeqList * L){
L - >長さ= 0; //リニア形0の長さを設定
}
(2)線状の非空を決定します。

ListEmpty INT(SeqList L){
IF(L.length == 0)
リターン1;

戻り0;
}
のシーケンス番号(3):

getElem INT(L SeqList、私、データ型* E INT){
//線形のルックアップテーブル、私は番目の要素、検索が成功した値Eに返され、成功したことを示す1を返し、-1テーブルとにかく故障。
IF(<1 || I> I L.length)
リターン-1;

* E = L.list [-I 1。];

リターン1;
}
(4)コンテンツによって検索します。

LocateElem INT(L SeqList、データ型電子){
Eの要素値線形//ルックアップテーブル要素
INT I;
(; L.length; I ++ I = 0)するための
IF(L.list [I] == e)に
戻り。+ 1つのI;

戻り0; //見つからないリターン0
}
(5)挿入操作:

i番目のテーブル要素E、成功した戻り、そうでなければリターン-1の順序は、テーブルがいっぱいである配列リターン0における//挿入位置
INT InsertList {(SeqListのL *は、I、データ型E INT)

; INT J
IF(I < 。|| I. 1> L->長さ+ 1){
リターン-1;
}
そうIF(L->長さ> = LISTSIZE){
戻り0;
}そうでなければ{
(J = L->長さ; J> = I。 J - ){
L->リスト[J] = L - >リスト[-J 1];
}
L->リスト= E; //要素がi番目の位置に挿入されている[1-I。】
L->長さ= L 。 - >長さ+ 1;
リターン1;
}
}
削除操作:(6)。

DeleteList(SeqList * L、I int型、データ型* E){int型

、int型のJ
IF(L->長さ<= 0){
戻り0;
}
そうであれば(I <1 || I> L長){
リターン-1。
}他{
* E = L - >リスト[I-1];
{(; J <= L->長-1 J ++ J = i)に対する
L->リスト[J-1] = L->長[J]。
}
L->長さ= L->長-1。
1を返します。
}
}
 小结:顺序表的优缺点。

(1)利点:テーブル内の要素間の関係を気にすることなく、それほどない追加の記憶空間、テーブル内の要素を迅速にどこでも取ることができます。

(2)短所:挿入および削除操作は、多数の要素を移動する必要があります。リニアテーブルの長さが大きく変化する場合だけでなく、事前に割り当てられたメモリ空間を使用する前に、記憶空間の容量を決定することは困難です。ストレージ容量の割り当ての巨大な無駄が生じ総会上の空間分布空間は、問題のニーズに適応することは困難で、小さすぎます。

 

1.3線形チェーンテーブル記憶された
他のメモリ構造を必要とする、線状の順次記憶構造には適していない時には、実際的な問題を解決するに、例えば、添加二変量多項式乗算-リンクされたストレージを。これは、連続又は不連続リニアフォームを記憶するための任意の記憶装置である要素のセットを使用します。その直接の後継者との各要素を表すために+が論理1、チェーンの記憶素子を格納するだけでなく、それ自体だけでなく、そのまま次の要素を指すメモリアドレスを愛愛。このようなメモリ構造は、ノード(ノード)と呼ばれます。記憶素子は、メモリ・アドレス・ポインタフィールドと呼ばれる、データフィールドと呼ばれています。論理的な順序ノードまたは要素がリスト線形単一リンクされたリストと呼ばれます。

最初のノードはそれへのヘッドポインタを必要とする、直接的な先行ノードを有していないからです。操作を容易にするために、第1のノード要素最初のノードの前のノードで呼ばれるデータフィールドは、行テーブルの長さなどの情報を格納することができる最初のノードを指し示すヘッドポインタとなり、第一のポインタフィールドを記憶していますアドレス情報要素ノード。リストが空の場合、ヘッドノードポインタフィールドは空白です。

そのポインタフィールドが「ヌル」に設定されているので、要素の最後の要素の即時の後継者がないため空にします。

単鎖メモリ構造は、C言語を用いて記述されています。

{typedefのノード構造体
データ型データ、
ノード*次のストラクト;
} ListNode、* LINKLIST;
、ListNodeノード型のリストであり、LINKLISTノードのリストをリンクされた前記ポインタの種類を指しています。LINKLIST L = ListNode * L.:それは次のように定義され

次のように一本鎖の基本的な操作は次のとおりです。

(1)初期化単鎖:

InitListボイド(* LINKLISTヘッド){
IF((ヘッド* =(LINKLIST)はmalloc(はsizeof(ListNode)))== NULL){
//最初のノードがストレージ・スペース割り当てるための
出口を(-1);
}
(ヘッド*) - >次= NULL; //第1ノードドメイン単独でリンクされたリストへのポインタが空である

(2)非空単鎖決意。

ListEmpty整数(LINKLISTヘッド){
IF(頭部>次に== NULL){//単一のリストが空である
リターン1;
}
そうでなければ
{
戻り0;
}
}
シリアル照会操作によって(3):

// i番目のノードでのシリアル番号によって単一のリストを見つける
ListNode取得*(LINKLISTヘッドIをINT){
; ListNode P *
、INT J
リストが空の場合はIF(ListEmpty(ヘッド)){//
戻りNULL;
}

IF (私は<1){
戻りNULL;
}

J = 0;
P =ヘッドと、
一方(P->!= NULL &&次J <I){//ノードを確保する空でないP
P = P->次、
J ++;
}
IF(J == I)// i番目のノードの検索
戻りPを、

戻りNULLを;
}
シーク動作の内容によって(4):

//プレス要素eのリスト要素値探索単一のコンテンツ
ListNode * LocateElem(LINKLISTヘッド、データ型電子){
ListNodeを* P;
P =頭部>次に、最初のノードへの//ポインタP点
一方(P) {
IF(!P->データ= E){
P = P->次; //次に進み
}他{
BREAK;
}
}
; Pを返す
}
(5)の操作を配置。

LocatePos INT(LINKLISTヘッド、データ型E){
ListNode * P; //点は、単一リンクされたリストのノードポインタPを定義する
INTをI;
IF(ListEmpty(ヘッド))//決定空でない
戻り0;

P =頭部>次、ノードを指す//ポインタp
。I = 1;
wihle(P){
IF(P->データ== E)は、
私は戻り、
そうでなければ
{
P = P->次; //点の次のノードに
iが++。
}
}
IF(P!)要素に等しい見つからない場合// E
戻り0;

}
新しいデータ要素Eインサート(6):

InsertList INT(LINKLISTヘッド、iは、データ型EをINT){
ListNode *プリ、* P; // i番目の要素定義のノードポインタ前駆予め、新生児ノードポインタP
INT J;
プリ=ヘッド; //ポインタプリ最初のノードを指す
J = 0;
一方(プレ>次に= NULL && J <1-I!){//ループIノード要素まで前駆まで
プリ=>次に事前;
Jを++;
}
(J = IF! I-1)//見つからない場合、挿入位置誤差
戻り0;

//新生児ノード
IF((P =(ListNode *)はmalloc(はsizeof(ListNode)))== NULL){
終了(-1)。
}
P->データ= E; Eは//ノードのデータ・フィールドに割り当て

、P->次に=プレ>次に
プレ>次に= P;
。;リターン1
}
(7)は、i番目のノードを削除します。

DeleteList INT(LINKLISTヘッド、I int型、データ型* E){
ListNodeプリ*、P *;
INT J;
プリ=ヘッド;
J = 0;
一方(プレ>次に= NULL &&プレ>ネクスト>次に! NULL && J = <{1-I)。
次に、予備=プレ>
J ++;
}
!IF(J = 1-I){
戻り0;
}
// i番目のポインタPポインティングリンクされたリスト内の単一のノードに、及びデータ・フィールドの値がEに割り当てられているノード
P =プレ>次に、
; * = P-E>データ
削除されたノードされるべき次のノードへの//ポインタフィールドの先行ノード点
プレ>次= P - >次に、
フリー(P); //解放ノードがpによって指し示さ
リターン1;
}
1.4比較単一リンクリスト順テーブル
(1)ストレージ順次リニアテーブルデータを格納する連続するメモリ位置のセットと配列表要素;線状のデータ要素を格納するためのメモリセルのセットを有する任意の単鎖つつ。

(2)パフォーマンス時間:時間計算を使用して、時系列のストレージ構造を探すには、O(1)は、移動平均は、データ要素の半分の挿入および削除を必要とし、時間計算量はO(N)です。シングルリスト記憶構造のルックアップ時間複雑度はO(n)が連結され、要素の挿入および削除を移動させることなく、時間複雑度はO(1)です。

(3)パフォーマンススペース:総会の無駄なオーバー事前に割り当てるストレージ構成に必要順次ストレージ・スペースを使用して、配布スペース、少なすぎる問題を引き起こす可能性があります。単一リンクリストストレージ構造を使用する場合、必要に応じて、一時的に割り当てることができる、それは問題の大きさを推定する必要がない限り、十分なメモリを割り当てることができるように、また、そのようなモノ数表現のようないくつかの特別な場合に使用することができます。

 

1.5一本鎖ループ
サイクル単一リンクリスト(円形LinkedListのは)最後まで単鎖末端、ヘッドノードまたは第一のリングのノード、最後のノードを構成するノードに、すなわち、最後の空ポインタ点でありますテールポインタと呼ばれる:リア。単一のリストを解析することで、空の状態は、単一のサイクルは、リストが空頭部>次==ヘッドであると判定され、頭部>次== NULLです。最初のアクセスノード、すなわちAリア>ネクスト>次。

二つの合成一本鎖ループ(LA、LB)リスト、単にテーブルヘッダと別のテーブルへのフッター接続する場合。具体的な手順:

1、LA->次= LB->ネクスト>次に、最初のノード。

図2に示すように、ヘッドノードLBの放出、フリー(LB->次);

図3に示すように、テーブルの端部のLA及びLBは、ヘッダ、LB->次= LA->次に接続されています。

リンクLINKLIST(LINKLIST HEAD1、HEAD2 LINKLIST){
ListNode P *、Q *;
P = HEAD1; // P点ノードに
一方(P->次= HEAD1! {//) サイクルリストポインタポイント最後のPへAノード
P = P->次に;
}
Q = HEAD2;
一方{//前出(Q-> = HEAD2次に!)

Q = Q->次に;
}
P->次に= head2->次に、//意志第二のリンクリストにリンクされたリストの後端に接続された第一のノード

Q->次= HEAD1; //最初に接続された最初のノードに第二連結リストの後端を接続する

戻りHEAD1。
}
注:最初のノードは、単一の円形のリンクリストは、センチネルノードとなることができます。

 

1.6二重リンクリスト
、二重リンクリスト(二重リンクリスト)は、リンクされたリスト内の各ノードは、2つのポインタドメイン、即時先行ノード点、直接後続ノードへの別のポイントを有することです。各ノードは、双方向リストのデータフィールド、以前ドメイン、次のフィールド、三つのドメインの合計を有します。フィールドに先立って先行ノードポインタフィールド;前記データフィールドは、データフィールド、データ記憶素子であり、次のフィールドは、後続ノード・ポインタ・フィールドです。二重リンクリスト操作はまた、ヘッドノードを容易にするために増加させることができるだけでなく、単鎖、環状構造を有している、双方向循環リストと呼びます。

循環リストが空の状態は最初のノードの道をされている分析:頭部>前==ヘッド||頭部>次==ヘッド。C言語記述:P = P-> prior->次= P->ネクスト>前。

二重連結リストノード構造ストレージは以下に説明します。

{typedefのノード構造体
データ型データ、
構造体*前ノードと、
ノード*次ストラクト;
;} DListNode、* DLinkListを
(1)は、第一の位置におけるノード要素値E Iに挿入されます。

分析:第i番目のノードを見つけ、新しいノードを申請し、ノードは、sがデータフィールドに電子を指摘しました。次に、ポインタフィールドpとS点のノードを変更する、即時先行ノードの点pの前のドメインSの修飾は、修飾された前駆体を直接ノードを指すように、次のドメインノードpはsが指す;変性次のフィールドがノードを指すようにSはPによって指され; Pは、ノードにポイントの前のフィールドを変更されたsが指します。

InsertDList INT(DListLinkヘッド、INT I、データ型E){
DListNode * P、* S;
INT J;
P =頭部>次に、
J = 0;
ながら(!P =ヘッド&& J <I){
P = P->次に;
J ++;
}
(J = I!){IF
戻り0;
}
S =(DListNode *)はmalloc(はsizeof(DListNode)); // Sに新しいノードを作成
IF {(S!)
リターン-1;
}
S - >データ= E; // EはSに割り当てられている
前駆体がP Sに割り当てられている前駆体へのポインタ//; S-> = P-前>前
; P-> prior->次= S // E - S 、後続のポインタP前駆症状に割り当てられた
S->次= P; //の後継は、pである
P->先立っ= S; //前駆体はP sで
リターン1;
}


(2)i番目のノードを削除

DeleteDList(DListLinkヘッド、INT I、データ型E){int型

; DListNode * P
INT J;
P =頭部>次に、
J = 0;
ながら(!P =ヘッド&& J <I){
P = P->次に、
J ++。
}
IF(J = I!)
戻り0;

P-> prior-> = P-次>次に、

P->ネクスト> = P-前>前に、

フリー(P);
リターン1;
}
1.7静的リスト
 上割り当てと解放ので動的リストと呼ばれるノードのリンクリスト、malloc関数により実現フリーダイナミック機能、様々です。しかし、いくつかの高レベルのプログラムは、ポインタ型ではありません、あなたが動的にリストを作成するために、上記の方法を使用することはできません、あなたは、機能の静的リスト、動的リストを使用する必要があります。

二次元アレイは、以下のように、種類の静的リストを使用して実装しました。

構造体のtypedef
{
データ型、データ;
int型のCUR;
} SListNode;

typedefは構造体
{
SListNodeリスト[LISTSIZE]; //ノードタイプ
int型のAV; //代替リストポインタ
} SLinkList; //静的リスト型
静的循環リスト:コンポーネント配列を表しますノード、代わりにポインタカーソル(ポインタCUR)によってノードのアレイの相対位置と同時に。最初のノードは、配列の0番目の成分、そのポインタフィールドリストを示す第1のノードです。最後に、ノード・テーブル・ポインタ・フィールドは、ヘッドノードを指し、0です。例:線形形式は次の通り:

 

変数sに設定されているSlinkListタイプ、S [0] .CUR iがSをIF = [0] .CUR、Sなら[I] .DATA表1要素 "陽" で表されるように、最初のノードであることを示しますS [i]は.CUR配列の2番目の要素の位置を示します。

静的リストの基本的な要素:

(1)静的初期化リスト:

空InitSList(SLINK * L){
int型I;
以下のために(私は= 0; I <LISTSIZEは、I ++){
(* L).LIST [i]は.CUR = I + 1。
(* L).LIST [LISTSIZE-1] .CUR = 0。
(* L).av = 1。
}
(2)分配结点:

int型AssignNode(SLINKリストL){
int型I。
= L.avで。
L.av = L.list .CUR [IN]。
見返りに、
}
(3)回收结点:

freenodeのボイド(SLinkList、INT POS){
L.list [POS] = L.av .CUR;
L.av = POS;
}
インサート(4):

InsertSLinkボイド(* SLinkList L、I int型、データ型E){
J、K、X INT;
K =(L *).av; //スタンバイアイドル鎖からノードを削除する

(* L).av =(* L ).list.cur; //有用スタンバイノードリストポイントを作る

(* L).LIST [K] .DATA = E; // アイドルノードに新しい要素は

//新しいノードが中に挿入されます位置に対応
J =(L *).LIST [0] .CUR;
のための(X = 1; X <I <I; X ++){
J =(L *).LIST [J] .CUR;
}
(* L).LIST [K] .CUR =(L用*).LIST [J] .CUR;
(L *).LIST [J] K = .CUR;
}
。(5)削除操作:

ボイドDeleteSList(SLinkList * L、INT I、データ型* E){
int型J、K、X。
IF(I == 1){
k =(L *).LIST [0] .CUR;
(* L).LIST [0] .CUR =(L *).LIST .CUR [K]を;
}

{
J =(L *).LIST [0] .CUR;
X <I-1; X ++){(X = 1)のために
J =(L *).LIST [J] .CUR。
}
K =(L *).LIST [J] .CUR。
(* L).LIST [J] .CUR =(L *).LIST .CUR [K]と、
}
(* L).LIST [K] .CUR =(L *).av。
* E =(L *).LIST [K] .DATA。
(* L).av = K。
}
 

1.8概要は
表1の関係で(1)線状要素との間にある、最初の要素に加えて、他の要素が最後の要素を除いて、唯一の直接の前駆体であり、他の要素は、唯一の直後の後続があります。

シーケンシャルテーブル線形(2)は2つの方法で貯蔵およびチェーンに格納されています。線形順序記憶テーブルは、注文テーブル構造となり、リニアチェーンテーブル記憶構造がリンクされたリストとなります。

データ要素の物理的な順序と配列表の一貫した論理的な順序(3)、ランダムアクセスとすることができます。チェーン・ポインタ・フィールドは、要素間の論理的な関係で表されます。

(4)リストを単一のリストに分け、二重リストをリンクされ、両方のリストだけでなく、単一サイクルリンクリスト、双方向循環リストを構成しています。単一のチェーン・ポインタ・フィールド、後続ノードを指し示す直接ポインタ・フィールド。二重別の直接後続ノードを指し示す直接先行ノードポインタフィールドにリストポインタフィールドポイントを連結。

配列表の利点(5)は、ランダムアクセス要素、比較的単純なアルゴリズム、記憶空間の高い利用率、事前に割り当てられたメモリ空間を必要とするという欠点のいずれかであることができ、メモリサイズが不十分に定義され、挿入および削除操作は、多数の要素を移動する必要があります。チェーンの利点は、所定の記憶スペースのサイズ、挿入及び削除ない要素が多量養素を移動する必要がないことであり、欠点を順次第1のアクセス・ノードからその唯一の要素であり、メモリセル使用率が高くない、より複雑なアルゴリズム、ポインタ操作を伴われ、不適切な操作は、予測不可能なメモリエラーを生成します。

おすすめ

転載: www.cnblogs.com/jvStarBlog/p/11982236.html