PROGRAM buecher1 (input,output,bibdatei);

{.pl71}

{$B-}

{ Fuehrt ein Verzeichnis von Buechern nach Autor, Titel und Bestellnummer. }
{ Gestattet das Aufsuchen, Einfuegen und Loeschen von Buechern.            }

TYPE kette    = string[20];
     bibzgr   = ^bibliste;
     bibliste = RECORD
                  naechster : bibzgr;
                  name      : kette;
                  autor     : kette;
                  bestnr    : integer
                END;

VAR anfang, buch     : bibzgr;
    bstnummer, index : integer;
    auswahl          : char;
    bibdatei         : text;

{-----------------------------------------------------------------------------}

PROCEDURE einfuegen (buch : bibzgr);

VAR p,q : bibzgr;

BEGIN { einfuegen }
  IF (anfang = NIL) OR (anfang^.bestnr > buch^.bestnr)
    THEN               { Buch an Spitze der Liste einfuegen.    }
      BEGIN
        buch^.naechster := anfang;
        anfang := buch
      END
    ELSE               { Buch in der Mitte der Liste einfuegen. }
      BEGIN
        p := anfang;
        q := anfang;
        WHILE (p^.naechster <> NIL) AND (p=q) DO
          BEGIN
            p := p^.naechster;
            IF p^.bestnr > buch^.bestnr
              THEN
                BEGIN
                  q^.naechster := buch;
                  buch^.naechster := p
                END
              ELSE
                q := p
          END;
          IF (p^.naechster = NIL) AND (p^.bestnr < buch^.bestnr)
            THEN       { Buch am Ende der List einfuegen.       }
              BEGIN
                buch^.naechster := NIL;
                p^.naechster := buch
              END
        END
END;  { einfuegen }

{-----------------------------------------------------------------------------}

PROCEDURE loeschen (bestnr : integer);

VAR p,q       : bibzgr;
    geloescht : boolean;

BEGIN { loeschen }
  geloescht := false;
  IF anfang = NIL
    THEN
      writeln ('Nichts zu loeschen.')
    ELSE
      IF anfang^.bestnr = bestnr
        THEN            { Erstes Buch loeschen. }
          BEGIN
            anfang := anfang^.naechster;
            geloescht := true
          END
        ELSE            { Liste durchsuchen.    }
          BEGIN
            p := anfang;
            q := anfang;
            WHILE (p^.naechster <> NIL) AND (p=q) AND (p^.bestnr < bestnr)
                                        AND (geloescht = false) DO
              BEGIN
                p := p^.naechster;
                IF p^.bestnr = bestnr
                  THEN
                    BEGIN { Buch loeschen. }
                      q^.naechster := p^.naechster;
                      geloescht := true
                    END
                  ELSE
                    q := p
              END;
            IF geloescht = false
              THEN
                BEGIN
                  writeln ('Buch nicht gefunden.');
                  writeln
                END
          END
END;  { loeschen }

{-----------------------------------------------------------------------------}

PROCEDURE liesdatei;

VAR index : integer;
    buch  : bibzgr;

BEGIN { liesdatei}
  {$I-}
  reset (bibdatei);
  {$I+}
  WHILE NOT eof(bibdatei) DO     { Buch uebernehmen. }
    BEGIN
      new (buch);
      readln(bibdatei, buch^.name);
      readln(bibdatei, buch^.autor);
      readln (bibdatei, buch^.bestnr);
      einfuegen (buch)
    END
END;  { liesdatei }

{-----------------------------------------------------------------------------}

PROCEDURE schreibdatei;

VAR p     : bibzgr;
    index : integer;

BEGIN { schreibdatei }
  rewrite (bibdatei);
  p := anfang;
  WHILE p <> NIL DO
    BEGIN
      writeln (bibdatei,p^.name);
      writeln (bibdatei,p^.autor);
      writeln (bibdatei, p^.bestnr);
      p := p^.naechster
    END
END;  { schreibdatei }

{-----------------------------------------------------------------------------}

BEGIN { buecher }

  ASSIGN (bibdatei,'datei.dat'); { TURBO-spezifisch }

  anfang := NIL;
  liesdatei;
  writeln ('Wollen Sie ein Buch einfuegen oder loeschen?');
  write ('Geben Sie ein "E" oder "L" ein: ');
  readln (auswahl);
  writeln;
  WHILE auswahl <> 'B' DO
    BEGIN               { Liste auf neuen Stand bringen.  }
      IF auswahl = 'E'
        THEN
          BEGIN         { Buch uebernehmen und einfuegen. }
            new(buch);
            write ('Geben Sie den Buchtitel ein: ');
            readln (buch^.name);
            writeln;
            write ('Geben Sie den Autornamen ein: ');
            readln (buch^.autor);
            writeln;
            write ('Geben Sie die Bestellnummer ein: ');
            readln (buch^.bestnr);
            writeln;
            einfuegen (buch)
          END;
        IF auswahl = 'L'
          THEN          { Nummer uebernehmen und Buch loeschen. }
            BEGIN
              write ('Geben sie die Bestellnummer an: ');
              readln (bstnummer);
              writeln;
              loeschen (bstnummer)
            END;
        write ('Einfuegen (E), Loeschen (L) oder Beenden (B)? ');
        readln (auswahl);
        writeln
    END;
  schreibdatei;
  writeln ('Die Bibliotheksdatei ist auf den neuen Stand gebracht.');
  writeln;
  writeln;

  close (bibdatei)  { TURBO-spezifisch }

END.  { buecher }
