| 表に読み込みながらリストを作る |
|---|
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}
|
たびたび出てくる ^ は → (データを指し示す矢印)の気持ちである.
半角文字には矢印がないので↑に似ている(?) ^ を使っている.
|
| デモを見る |