home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / fst / modula1 / dyndatso.mod < prev    next >
Text File  |  1993-07-28  |  3KB  |  106 lines

  1. MODULE DynDatSort;
  2. (* Sortieren von positivn INTEGERn mit Hilfe von Dynamischen Daten-
  3.    strukturen. Die zu sortierenden INTEGER müssen explizit eingegeben
  4.    werden. Durch Eingabe einer negativen Zahl wird die Eingabe
  5.    beendet und es erfolgt eine sortierte Ausgabe der Zahlen.  *)
  6.  
  7. FROM SYSTEM IMPORT SIZE;
  8. FROM Storage IMPORT ALLOCATE;
  9. FROM IO IMPORT RdInt,WrStr,WrInt,WrLn;
  10. FROM InOut IMPORT ReadInt;
  11.  
  12. TYPE tpToKnoten=POINTER TO tKnoten;
  13.      tKnoten=RECORD
  14.                 naechsterKn:tpToKnoten;
  15.                 KnotenWert:INTEGER;
  16.               END;  (* RECORD *)
  17. VAR pKnoten:tpToKnoten;
  18.     pRoot,pVorgaenger:tpToKnoten;
  19.     Wert:INTEGER;
  20.  
  21. PROCEDURE  CreateKnoten(Wert:INTEGER):tpToKnoten;
  22. (* erzeuge Knoten mit dem KnotenWert Wert *)
  23.   VAR plKnoten:tpToKnoten;
  24.       Knoten:tKnoten;
  25.       (* wird nur für die Beschaffung von Speicher benötigt *)
  26.   BEGIN (* Create Knoten *)
  27.     ALLOCATE(plKnoten,SIZE(Knoten));
  28.     WITH plKnoten^ DO
  29.       KnotenWert:=Wert;
  30.       naechsterKn:=NIL
  31.     END;
  32.     RETURN plKnoten
  33.   END CreateKnoten;
  34.  
  35. PROCEDURE SearchPred(start:tpToKnoten;
  36.                      Wert:INTEGER):tpToKnoten;
  37. (* suche ab dem Knoten start den Knoten mit KnotenWert>Wert
  38.  * Rueckgabewert:NIL falls kein Vorgaenger,
  39.  *sonst Zeiger auf diesen Knoten *)
  40.   VAR p1,p2:tpToKnoten;
  41.   BEGIN  (* SearchPred *)
  42.     p1:=NIL;
  43.     p2:=start;
  44.     WHILE (p2<>NIL) & (p2^.KnotenWert<=Wert) DO
  45.       p1:= p2;
  46.       p2:=p1^.naechsterKn;
  47.     END;  (* WHILE *)
  48.     RETURN p1
  49.   END SearchPred;
  50.  
  51. PROCEDURE OutSortedData(start:tpToKnoten);
  52. (* gibt die sortierten Daten aus *)
  53.   VAR p1,p2:tpToKnoten;
  54.   cnt:INTEGER;
  55.   BEGIN
  56.     cnt:= 1;
  57.     p1:=start;
  58.     WHILE (p1<>NIL) DO
  59.       IF (cnt MOD 11)=0 THEN WrLn END;
  60.       WrInt(p1^.KnotenWert,6);
  61.       INC(cnt);
  62.       p1:=p1^.naechsterKn;
  63.     END (* WHILE *)
  64.   END OutSortedData;
  65.  
  66. BEGIN  (* MAIN *)
  67.   pRoot:=NIL;
  68.   WrStr('Bitte positive zahlen eingeben ');
  69.   WrStr('  (Eingabeende durch negative Zahl)');
  70.   WrLn;
  71.   LOOP
  72.     LOOP
  73.       WrStr('Bitte Zahl eingeben: ');
  74.       ReadInt( Wert);
  75.       IF Wert>MAX(INTEGER) THEN WrLn;
  76.                                  WrStr('Wert zu groß!');
  77.       ELSE EXIT
  78.       END;  (* IF *)
  79.     END;   (* LOOP *)
  80.     WrLn;
  81.     IF Wert>=0 THEN
  82.        pKnoten:=CreateKnoten(Wert);
  83.        pVorgaenger:=SearchPred(pRoot,Wert);
  84.        IF pVorgaenger=NIL THEN
  85.           IF pRoot=NIL THEN
  86.              pRoot:=pKnoten;
  87.           ELSE
  88.                pKnoten^.naechsterKn:=pRoot;
  89.                pRoot:=pKnoten
  90.           END   (* IF *)
  91.        ELSE
  92.           pKnoten^.naechsterKn:=pVorgaenger^.naechsterKn;
  93.           pVorgaenger^.naechsterKn:=pKnoten;
  94.        END   (* IF *)
  95.     ELSE
  96.        OutSortedData(pRoot);
  97.        EXIT
  98.     END  (* IF *)
  99.   END  (* LOOP *)
  100. END DynDatSort.
  101.  
  102.  
  103.  
  104.  
  105.  
  106.