一般表レプリケーションは、レプリケーション・プロセスは、常にヘッダとテールです。ヘッダーまたはフッターにも一般化テーブル、まだコピーされたヘッダとフッタである場合。
そのため、一般のリストをコピーする処理は、実際には、テーブル・テーブル・ヘッドおよびプロセス・リストの末尾に一般再帰コピーを続けます。
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 ; }