リニアテーブル - 双方向循環リスト

1、双方向循環リスト

二重ノードごとに単一のリストにリストを連結し、その前駆体は、カートンノードポインタフィールドが設けられています。二重リンクリストは、効果的に時間のためのスペースを使用して、アルゴリズムの時のパフォーマンスを向上させることができます。


typedefのストラクトノード
{ 
    elemTypeデータを、
    ストラクト前*ノード;     // 即時先行ポインタが
    ストラクトノード*次の;     // 即時後継ポインタ 
}ノード、* CLinkList。

図2に示すように、二重リンクリストオーダー:(注)

S->次= P; 
S - >前= P-> 前; 
P - > prior->次= S。
P - >前= S;

削除ノード:

P-> prior->次= P-> 次。
P - >ネクスト>前= P-> 前。
無料(P);

3、例:

する#include <stdio.hに> 
する#include <STDLIB.H> の#define OK 1つ
 の#define ERROR 0 
のtypedef チャーElemType。
typedef int型の  ステータス。
typedefは構造体DualNode 
{ 
    ElemTypeデータ。構造体 DualNodeは* 前。
    構造体 DualNodeは、* 次の; 
} DualNode、 * DuLinkList。
ステータスInitList(DuLinkList * L)
{ 
    DualNode * P * Q。
    int型私は、* L =(DuLinkList)はmallocはsizeof




    


    (DualNode))。
    もし(!(* L))
    { 
        戻りERROR; 
    }  * L) - >前=(L *) - >次= NULL; 
    P =(* L)。

    以下のために(私は= 0 ; I < 26 ; I ++ 
    { 
        Q =(DualNode *)はmallocはsizeof (DualNode))。
        もし(!Q)
        { 
            戻りERROR; 
        } 
        Q - >データ= ' A ' + I。
        Q - >前=P; 
        Q - >次= P-> 次。
        P - >次= Q。

        P = Q。
    } 
    P - >次=(L *) - > 次。 L *) - >ネクスト>前= P。 L *) - >前= P-> 前;
    リターンOK。
} 

ボイドシーザー(DuLinkList * L、int型のI)
{ 
    場合(I> 0 
    { 
         
        {  L *)=(L *) - > 次。
        } 一方、( - I)。
    }

    もし(I < 0 
    { 
        行う
        {  L *)=(L *) - > 前; 
        } 一方、(++ I)。
    } 
} 

int型のmain()
{ 
    DuLinkList L。
    int型私は、N。

    InitList( L)。
    printf(" 请输入一个整数:" ); 
    scanf_s(" %のD "、&N)
    printf(" \ n個" ); 
    シーザー(L、N)。

    ため、私は=(0; I < 26 ; I ++ 
    { 
        L = L-> 次。
        printf(" %のC "、(L) - > データ)。
    } 
    のprintf(" \ n " );
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lemonzhang/p/12336864.html