表に読み込みながらリストを作る |
---|
type String10 = string[10]; TSoeji = 0..9; TKojin = record Namae : String10; Ten : Integer; Next : TSoeji; end; THyou = array [TSoeji] of TKojin; var Ninzuu : TSoeji; First : TSoeji; Hyou : THyou; procedure FileKaraYomu; procedure ListNiTsuika(N : TSoeji; var P : TSoeji); begin if (P > 0) and (Hyou[P].Ten > Hyou[N].Ten) then ListNiTsuika(N,Hyou[P].Next) // 再帰呼び出し else begin Hyou[N].Next := P; P := N; end; end; {ListNiTsuika} var InF : Text; K : TSoeji; begin Assign(InF,'Seiseki.txt'); Reset(InF); First := 0; K := 0; repeat Inc(K); ReadLn(InF, Hyou[K].Namae, Hyou[K].Ten); ListNiTsuika(K,First); until EoF(InF); Close(InF); Ninzuu := K; end; {FileKaraYomu}
|
表に読み込む方式は,あらかじめ Hyou を用意しないといけない.
用意した Hyou が小さいとすべてのデータを読み込むことができない.
大きな Hyou を用意するとデータが少ないときもったいない. あらかじめ用意した表に読み込むことをやめて, 必要になったときに必要なだけの領域を確保して(動的割付という)読み込むようにする. |
type String10 = string[10]; PKojin = ^TKojin; TKojin = record Namae : String10; Ten : Integer; Next : PKojin; end; // THyou は使わない var Ninzuu : Integer; First : PKojin; // Hyou は使わない procedure FileKaraYomu; procedure ListNiTsuika(N : PKojin; var P : PKojin); begin if (P <> Nil) and (P^.Ten > N^.Ten) then ListNiTsuika(N,P^.Next) else begin N^.Next := P; P := N; end; end; {ListNiTsuika} var InF : Text; K : PKojin; begin Assign(InF,'Seiseki.txt'); Reset(InF); First := Nil; K := Nil; repeat New(K); ReadLn(InF, K^.Namae, K^.Ten); ListNiTsuika(K,First); until EoF(InF); Close(InF); // このままでは Ninzuu はわからない end; {FileKaraYomu} |
たびたび出てくる ^ は → (データを指し示す矢印)の気持ちである.
半角文字には矢印がないので↑に似ている(?) ^ を使っている.
|
デモを見る |