呉ユーキション - 生まれのナチュラルなデータ構造:一般的なリストのコピー

一般表レプリケーションは、レプリケーション・プロセスは、常にヘッダとテールです。ヘッダーまたはフッターにも一般化テーブル、まだコピーされたヘッダとフッタである場合。
そのため、一般のリストをコピーする処理は、実際には、テーブル・テーブル・ヘッドおよびプロセス・リストの末尾に一般再帰コピーを続けます。
2つの輸出再帰があります:
データ要素を通過する電流は空のテーブルがある場合は、単に空のテーブルを返します。
現在のデータ要素は、テーブルのための原子を横断している場合、それは返すようにコピーします。

する#include <stdio.hに> 
する#include <STDLIB.H> 
のtypedef 構造体GLNode {
     int型のタグ; // フラグフィールド
    ユニオン{
         チャー原子であり; // 原子ノードが範囲
        のstruct {
             構造体 GLNode * HP、* TPを; 
        } PTR ; // 子ノードテーブル・ポインタ・フィールド、HPポイントヘッダ、トレーラーへTPポイント
    }; 
} * GLIST、GNODE; 
GLIST creatGlist(GLIST C){ 
    // 一般表C 
    C =(GLIST)はmallocはsizeof (GNODE )); 
    C - > =タグ。1 ;
     // ヘッダ原子'A'
    C-> ptr.hp =(GLIST)はmallocはsizeof (GNODE)); 
    C - > ptr.hp->タグ= 0 ; 
    C - > ptr.hp->アトム= ' A ' ;
     // テーブル表オコ(B、C、D)、全体が 
    C-> ptr.tp =(GLIST)はmallocはsizeof (GNODE)); 
    C - > ptr.tp-> =タグ。1 
    C - > ptr.tp-> PTR = .HP(GLIST)はmallocはsizeof (GNODE)); 
    C - > ptr.tp-> ptr.tp = NULL;
     // 次のデータ要素(B、C、D)、ヘッダが'B'での格納を開始、テーブルの端部(C、D) 
    C-> ptr.tp-> ptr.hp-> =タグ。1 
    C- > ptr.tp-> ptr.hp-> ptr.hp =(GLIST)はmallocはsizeof (GNODE))。
    C - > ptr.tp-> ptr.hp-> ptr.hp->タグ= 0 
    C - > ptr.tp-> ptr.hp-> ptr.hp->原子= ' B ' 
    C - > ptr.tp-> ptr.hp-> ptr.tp =(GLIST)はmallocはsizeof (GNODE))。
    // 存放子表(C、D)、表头为C、表尾为D 
    C-> ptr.tp-> ptr.hp-> ptr.tp->タグ= 1 
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.hp =(GLIST)はmallocはsizeof (GNODE))。
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.hp->
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.hp->原子= ' C ' 
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.tp =(GLIST)はmallocはsizeof (GNODE))。
    // 存放表尾D 
    C-> ptr.tp-> ptr.hp-> ptr.tp-> ptr.tp->タグ= 1 
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.tp-> ptr.hp =(GLIST)はmallocはsizeof (GNODE))。
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.tp-> ptr.hp->タグ= 0 
    C - > ptr.tp-> ptr.hp-> ptr.tp-> ptr.tp-> ptr.hp->原子= ' D ' NULL;
     戻りC; 
} 
ボイド copyGlist(GLIST C、GLIST * T){
     // もしCが直接空のテーブルのように、空の、そのコピーテーブルである
    IF(!{C)
         * T = NULL; 
    } 
    そうでなければ{
         * T =( GList)のmallocはsizeof(GNODE)); // Tを適用するためのCが空でない、メモリ空間
         // アプリケーションに障害が発生し、プログラムが停止
        IF(*!T){ 
            終了(0 ); 
        }  * T) - >タグ=をC->タグ; //は、タグ値テーブルCコピー
         //はそれが直接コピーされた場合、現在のリスト要素原子か否かを判断する
        IF(C->タグ==0 ){  * T) - > C原子=> 原子; 
        }  { // その説明サブテーブルにランが複製さ 
            copyGlist(C-> ptr.hp、&( (* T) - > PTR。 HP)); // コピーヘッダ 
            copyGlist(C-> ptr.tp、&((T *) - > ptr.tp)); // コピーフッタ
        } 
    } 
} 
int型のmain(int型 ARGC、CONST  文字 * ARGV []){ 
    GLIST C = NULL; 
    C = creatGlist(C); 
    GLIST T = NULL;
    copyGlist(C、 T)。
    printf(" %のC"、T-> ptr.hp-> 原子);
     戻り 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/tszr/p/12232471.html