|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5504 (0x1580)
Types: TextFile
Names: »KAEDE4.PAS«
└─⟦08ea08c61⟧ Bits:30003924 PolyPascal programmer
└─⟦this⟧ »KAEDE4.PAS«
PROGRAM kaede4;
TYPE
str40 = STRING(.40.);
link = ^ post;
post = RECORD
naeste : link;
navn : str40;
adresse : str40;
END;
VAR
ud, top, pp, friliste : link;
ch : CHAR;
PROCEDURE frigoer(pp : link);
BEGIN (* frigoer *)
pp^.naeste := friliste;
friliste := pp;
END; (* frigoer *)
PROCEDURE opret(VAR pp : link);
BEGIN (* opret *)
IF friliste = NIL
THEN NEW(pp)
ELSE
BEGIN
pp := friliste;
friliste := friliste^.naeste;
END;
pp^.naeste := NIL;
END; (* opret *)
PROCEDURE indsaet(VAR foerste : link; nypost : link);
VAR
ch : CHAR;
BEGIN (* indsaet *)
IF foerste = NIL (* kæden er tom *)
THEN foerste := nypost
ELSE IF nypost^.navn < foerste^.navn (* før første post *)
THEN
BEGIN
nypost^.naeste :=foerste;
foerste :=nypost;
WRITELN;
WRITE(nypost^.navn, ' er nu indsat i kæden. ',
'Tast <RETURN>: ');
READLN(ch);
END
ELSE (* find rigtig plads til nypost via rekursivt kald *)
indsaet(foerste^.naeste, nypost);
END; (* indsaet *)
PROCEDURE fjern(VAR foerste : link; VAR glpost : link);
VAR
ch : CHAR;
ud : link;
BEGIN (* fjern *)
IF foerste = NIL (* kæden tom *)
THEN
BEGIN
WRITE(glpost^.navn, ' findes ikke i kæden',
' Tast <RETURN>: ');
READLN(ch);
END
ELSE IF foerste^.navn = glpost^.navn (* fjern post 1 *)
THEN
BEGIN
ud := foerste;
foerste := foerste^.naeste;
frigoer(ud);
WRITE(glpost^.navn, ' er nu slettet fra kæden. ',
'Tast <RETURN>: ');
READLN(ch);
END
ELSE (* Søg efter navnet via rekursivt kald *)
fjern(foerste^.naeste, glpost);
END; (* fjern *)
PROCEDURE udskriv(foerste : link);
VAR
pp : link;
ch : CHAR;
BEGIN (* udskriv *)
pp := foerste;
WRITELN;
WRITELN('Kæden indeholder følgende personer:');
WRITELN;
WHILE pp <> NIL DO
BEGIN
WRITELN(pp^.navn);
WRITELN(pp^.adresse);
WRITELN;
pp := pp^.naeste;
END;
WRITE('Tast <RETURN>: ');
READLN(ch);
END; (* udskriv *)
BEGIN (* kaede4 *)
top := NIL;
friliste := NIL;
NEW(ud);
REPEAT
WRITE(CLRHOM);
GOTOXY(10,4); WRITE('SORTERET KÆDE');
GOTOXY(10,7); WRITE('I. Indsæt person i kæden.');
GOTOXY(10,9); WRITE('F. Fjerne person fra kæden.');
GOTOXY(10,11); WRITE('U. Udskrive kæden.');
GOTOXY(10,13); WRITE('A. Afslutte programmet.');
GOTOXY(10,15); WRITE('L. Ledig lagerplads.');
GOTOXY(10,17); WRITE('Tast kommando: ');
REPEAT
READ(KBD, ch);
UNTIL ch IN (.'I', 'i', 'F', 'f', 'U', 'u', 'A', 'a',
'L', 'l'.);
WRITELN(ch);
CASE ch OF
'I', 'i' : BEGIN
opret(pp);
WRITELN;
WRITE('Navn: '); READLN(pp^.navn);
WRITE('Adresse: '); READLN(pp^.adresse);
indsaet(top, pp);
END;
'F', 'f' : BEGIN
WRITELN;
WRITE('Hvem skal fjernes: ');
READLN(ud^.navn);
fjern(top, ud);
END;
'U', 'u' : udskriv(top);
'L', 'l' : BEGIN
WRITELN;
WRITE('Rest lager: ', MEMAVAIL, ' paragraphs.');
WRITELN;
WRITELN('1 paragraph = 16 bytes.');
WRITE('Tast <RETURN>: ');
READLN(ch);
END;
END;
UNTIL ch IN (.'A', 'a'.);
END. (* kaede4 *)
«eof»