PACKET systembaumDEFINES sohnvon,reorganisieren,gibbaumtabelle,KNOTEN ,=, neuerknoten,nilknoten,markierungsknoten,erster,naechster,gueltig,suche, existiert,read,write,inknotenmenge,ausknotenmenge,knotenloeschen,move, KNOTENMENGE ,:=,zahlderelemente,leereknotenmenge,knotenmengeloeschen,exporte, importe,system,listederteilbaeume,startesystembaum,kopieresystembaum, ueberschreibesystembaum,setzesystembaumzurueck:BOOL PROC sohnvon(KNOTEN CONST vater,sohn):pos(kmknoten,CONCR (sohn))>0.kmknoten:IF CONCR (vater)<= maxknTHEN systembaum.tabzeile(CONCR (vater)).knotenELSE verwaltung.tabzeile( CONCR (vater)-maxkn).knotenFI .ENDPROC sohnvon;LET maxkn=2190,niltext="",null =0,knindex=1;LET kn1=2191,kn2=2192,kn3=2193;LET systembaumname="BAISY-0", systembaumkopie="SBKOP",verwaltungsname="BAISY-1",verwaltungskopie="VWKOP"; LET maxhoehe=100,bottom=1,refkz="1",erreichtkz="2";LET reorgincr=7000;TYPE TUPEL =STRUCT (KNOTEN kn,INT index,BOOL markiert);TYPE STACK =STRUCT (ROW maxhoeheTUPEL st,INT top);TYPE KNOTENMENGE =INT ;TYPE KNOTEN =INT ;TYPE EINTRAG =STRUCT (TEXT attribute,KNOTEN vater,LONGROW knotenmengenLONGROW knoten);TYPE SYSTAB =STRUCT (INT maxeintrag,ersterfreier,ROW maxknEINTRAG tabzeile);KNOTEN CONST nilknoten:=KNOTEN :(null);KNOTEN CONST markierungsknoten:=KNOTEN :(4711);BOUND SYSTAB VAR systembaum;BOUND SYSTAB VAR verwaltung;BOUND SYSTAB VAR reorg;KNOTENMENGE VAR exp,imp,sys;PROC gibbaumtabelle(TEXT CONST startknotenname,DATASPACE VAR ds):CONCR (systembaum .tabzeile(systembaum.ersterfreier).vater):=zeilennr(startknotenname);ds:=old( systembaumname)END PROC gibbaumtabelle;INT PROC zeilennr(TEXT CONST startknotenname):KNOTEN VAR k;IF existiert(exporte,k,startknotenname)THEN KNOTENMENGE VAR soehne;read(k,soehne);CONCR (erster(soehne))ELSE nullFI END PROC zeilennr;OP :=(KNOTEN VAR k,KNOTEN CONST l):CONCR (k):=CONCR (l)END OP :=;BOOL OP =(KNOTEN CONST k,KNOTEN CONST l):CONCR (k)=CONCR (l)END OP =; KNOTEN PROC neuerknoten(KNOTENMENGE CONST m):KNOTEN VAR k;CONCR (k):= neuereintrag(CONCR (m)<>CONCR (sys),true);inknotenmenge(m,k);kEND PROC neuerknoten;KNOTEN PROC neuerknoten(KNOTENMENGE CONST m,TEXT CONST schluessel ):KNOTEN VAR k;IF existiert(m,k,schluessel)THEN LEAVE neuerknotenWITH kFI ; KNOTEN VAR l;CONCR (l):=neuereintrag(CONCR (m)<>CONCR (sys),true);write(l, schluessel);inknotenmenge(m,l,k);lEND PROC neuerknoten;BOOL PROC existiert( KNOTENMENGE CONST a,KNOTEN VAR r,TEXT CONST muster):BOOL VAR gefunden;suche(a ,muster,r,gefunden);gefundenEND PROC existiert;PROC read(KNOTEN CONST k, KNOTEN VAR vater):vater:=kvater.kvater:IF CONCR (k)<=maxknTHEN systembaum. tabzeile(CONCR (k)).vaterELSE verwaltung.tabzeile(CONCR (k)-maxkn).vaterFI . END PROC read;PROC read(KNOTEN CONST k,KNOTENMENGE VAR soehne):CONCR (soehne) :=CONCR (k)END PROC read;PROC read(KNOTEN CONST k,TEXT VAR attribute): attribute:=kattribute.kattribute:IF CONCR (k)<=maxknTHEN systembaum.tabzeile( CONCR (k)).attributeELSE verwaltung.tabzeile(CONCR (k)-maxkn).attributeFI . END PROC read;PROC read(KNOTEN CONST k,EINTRAG VAR attribute):attribute:= keintrag.keintrag:IF CONCR (k)<=maxknTHEN systembaum.tabzeile(CONCR (k))ELSE verwaltung.tabzeile(CONCR (k)-maxkn)FI .END PROC read;PROC write(KNOTEN CONST k,KNOTEN CONST vater):kvater:=vater.kvater:IF CONCR (k)<=maxknTHEN systembaum.tabzeile(CONCR (k)).vaterELSE verwaltung.tabzeile(CONCR (k)-maxkn) .vaterFI .END PROC write;PROC write(KNOTEN CONST k,KNOTENMENGE CONST soehne): kknoten:=sohnknoten.kknoten:IF CONCR (k)<=maxknTHEN systembaum.tabzeile( CONCR (k)).knotenELSE verwaltung.tabzeile(CONCR (k)-maxkn).knotenFI . sohnknoten:IF CONCR (soehne)<=maxknTHEN systembaum.tabzeile(CONCR (soehne)). knotenELSE verwaltung.tabzeile(CONCR (soehne)-maxkn).knotenFI .END PROC write ;PROC write(KNOTEN CONST k,TEXT CONST attribute):kattribute:=attribute. kattribute:IF CONCR (k)<=maxknTHEN systembaum.tabzeile(CONCR (k)).attribute ELSE verwaltung.tabzeile(CONCR (k)-maxkn).attributeFI .END PROC write;PROC write(KNOTEN CONST k,EINTRAG CONST attribute):keintrag:=attribute.keintrag: IF CONCR (k)<=maxknTHEN systembaum.tabzeile(CONCR (k))ELSE verwaltung. tabzeile(CONCR (k)-maxkn)FI .END PROC write;PROC inknotenmenge(KNOTENMENGE CONST km,KNOTEN CONST k):kmknotenCAT kindex;kknotenmengenCAT kmindex.kmknoten :IF CONCR (km)<=maxknTHEN systembaum.tabzeile(CONCR (km)).knotenELSE verwaltung.tabzeile(CONCR (km)-maxkn).knotenFI .kknotenmengen:IF CONCR (k)<= maxknTHEN systembaum.tabzeile(CONCR (k)).knotenmengenELSE verwaltung.tabzeile (CONCR (k)-maxkn).knotenmengenFI .kindex:CONCR (k).kmindex:CONCR (km).END PROC inknotenmenge;PROC inknotenmenge(KNOTENMENGE CONST km,KNOTEN CONST k,l): IF l=nilknotenTHEN inknotenmenge(km,k)ELSE insert(kmknoten,posl,kindex); kknotenmengenCAT kmindexFI .posl:pos(kmknoten,lindex).kmknoten:IF CONCR (km) <=maxknTHEN systembaum.tabzeile(CONCR (km)).knotenELSE verwaltung.tabzeile( CONCR (km)-maxkn).knotenFI .kknotenmengen:IF CONCR (k)<=maxknTHEN systembaum. tabzeile(CONCR (k)).knotenmengenELSE verwaltung.tabzeile(CONCR (k)-maxkn). knotenmengenFI .kindex:CONCR (k).lindex:CONCR (l).kmindex:CONCR (km).END PROC inknotenmenge;PROC ausknotenmenge(KNOTENMENGE CONST km,KNOTEN VAR k): KNOTEN VAR l:=k;naechster(l,km);delete(kmknoten,kindex);delete(kknotenmengen, kmindex);k:=l.kmknoten:IF CONCR (km)<=maxknTHEN systembaum.tabzeile(CONCR (km )).knotenELSE verwaltung.tabzeile(CONCR (km)-maxkn).knotenFI .kknotenmengen: IF CONCR (k)<=maxknTHEN systembaum.tabzeile(CONCR (k)).knotenmengenELSE verwaltung.tabzeile(CONCR (k)-maxkn).knotenmengenFI .kindex:pos(kmknoten, CONCR (k)).kmindex:pos(kknotenmengen,CONCR (km)).END PROC ausknotenmenge; PROC knotenloeschen(KNOTENMENGE CONST km,KNOTEN VAR k):IF knotenundknotenmengeexistierenTHEN ausallenmengen;sohnknotenmengeloeschen; ungueltigmachen(CONCR (l))FI .knotenundknotenmengeexistieren:(CONCR (km)<>0) CAND (CONCR (k)<>0).ausallenmengen:KNOTEN VAR nachf:=k;KNOTEN CONST l:=k; LONGROW VAR mengen:=kknotenmengen;INT VAR i,mindex;KNOTENMENGE VAR m;FOR i FROM 1UPTO length(mengen)REP mindex:=mengen_i;CONCR (m):=mindex; ausknotenmenge(m,k);IF mindex=CONCR (km)THEN nachf:=kFI ;k:=lPER ;k:=nachf. sohnknotenmengeloeschen:KNOTENMENGE VAR soehne;CONCR (soehne):=CONCR (l); knotenmengeloeschen(soehne).kknotenmengen:IF CONCR (k)<=maxknTHEN systembaum. tabzeile(CONCR (k)).knotenmengenELSE verwaltung.tabzeile(CONCR (k)-maxkn). knotenmengenFI .END PROC knotenloeschen;PROC move(KNOTEN CONST k,KNOTEN CONST l):eigenschaftenuebertragen;pointerpflegen.eigenschaftenuebertragen: systembaum.tabzeile(CONCR (l)).knoten:=systembaum.tabzeile(CONCR (k)).knoten; systembaum.tabzeile(CONCR (l)).attribute:=systembaum.tabzeile(CONCR (k)). attribute.pointerpflegen:soehnevonkumsetzen;vaetervonkumsetzen. soehnevonkumsetzen:soehneumsetzen(systembaum.tabzeile(CONCR (k)).knoten,k,l). vaetervonkumsetzen:vaeterumsetzen(systembaum.tabzeile(CONCR (k)).knotenmengen ,k,l).END PROC move;PROC soehneumsetzen(LONGROW CONST soehne,KNOTEN CONST von ,nach):INT VAR i;FOR iFROM 1UPTO length(soehne)REP INT VAR sohni:=soehne_i; replace(beisohni,posvon,CONCR (nach))PER .beisohni:systembaum.tabzeile(sohni) .knotenmengen.posvon:pos(beisohni,CONCR (von)).END PROC soehneumsetzen;PROC vaeterumsetzen(LONGROW CONST vaeter,KNOTEN CONST von,nach):INT VAR i,refindex ;refindex:=CONCR (systembaum.tabzeile(CONCR (von)).vater);FOR iFROM 1UPTO length(vaeter)REP INT VAR vateri:=vaeter_i;vaterumsetzen(vateri,refindex,nach )PER END PROC vaeterumsetzen;PROC vaterumsetzen(INT CONST vaterindex,refindex ,KNOTEN CONST nach):IF (vaterindex<>CONCR (system))CAND (vaterindex<>refindex )THEN KNOTENMENGE VAR vater;CONCR (vater):=vaterindex;inknotenmenge(vater, nach)FI END PROC vaterumsetzen;KNOTEN PROC erster(KNOTENMENGE CONST m): LONGROW CONST ordnung:=mknoten;ersternach(null,ordnung).mknoten:IF CONCR (m) <=maxknTHEN systembaum.tabzeile(CONCR (m)).knotenELSE verwaltung.tabzeile( CONCR (m)-maxkn).knotenFI .END PROC erster;PROC naechster(KNOTEN VAR k, KNOTENMENGE CONST m):LONGROW CONST ordnung:=mknoten;k:=ersternach(indexvonk, ordnung).indexvonk:pos(ordnung,CONCR (k)).mknoten:IF CONCR (m)<=maxknTHEN systembaum.tabzeile(CONCR (m)).knotenELSE verwaltung.tabzeile(CONCR (m)-maxkn ).knotenFI .END PROC naechster;BOOL PROC gueltig(KNOTEN CONST k):CONCR (k)<> nullEND PROC gueltig;PROC suche(KNOTENMENGE CONST m,TEXT CONST muster,KNOTEN VAR k,BOOL VAR gefunden):LONGROW CONST ordnung:=mknoten;INT CONST l:=length( ordnung);IF l=nullTHEN gefunden:=false;k:=nilknotenELSE INT VAR ordnungsindex ;binsearch(ordnung,muster,BOOL PROC (TEXT CONST ,INT CONST )kleiner, ordnungsindex);IF ordnungsindex>lTHEN gefunden:=false;k:=nilknotenELSE CONCR (k):=ordnung_ordnungsindex;TEXT VAR gefundenesmuster;read(k,gefundenesmuster) ;gefunden:=(muster=gefundenesmuster)FI FI .mknoten:IF CONCR (m)<=maxknTHEN systembaum.tabzeile(CONCR (m)).knotenELSE verwaltung.tabzeile(CONCR (m)-maxkn ).knotenFI .END PROC suche;OP :=(KNOTENMENGE VAR k,KNOTENMENGE CONST l): CONCR (k):=CONCR (l)END OP :=;INT PROC zahlderelemente(KNOTENMENGE CONST km): length(kmknoten).kmknoten:IF CONCR (km)<=maxknTHEN systembaum.tabzeile(CONCR (km)).knotenELSE verwaltung.tabzeile(CONCR (km)-maxkn).knotenFI .END PROC zahlderelemente;KNOTENMENGE PROC leereknotenmenge:KNOTENMENGE VAR k;CONCR (k) :=neuereintrag(true,false);kEND PROC leereknotenmenge;PROC knotenmengeloeschen(KNOTENMENGE VAR km):IF knotenmengeexistiertTHEN allezeigerloeschen;alsungueltigkennzeichnenFI .knotenmengeexistiert:CONCR (km )<>0.allezeigerloeschen:INT CONST kmind:=CONCR (km);LONGROW VAR knoten:= kmindknoten;INT VAR i,kindex;LONGROW VAR row;FOR iFROM 1UPTO length(knoten) REP kindex:=knoten_i;row:=kindexknotenmengen;delete(kindexknotenmengen,pos( row,kmind))PER ;.kmindknoten:IF kmind<=maxknTHEN systembaum.tabzeile(kmind). knotenELSE verwaltung.tabzeile(kmind-maxkn).knotenFI .kindexknotenmengen:IF kindex<=maxknTHEN systembaum.tabzeile(kindex).knotenmengenELSE verwaltung. tabzeile(kindex-maxkn).knotenmengenFI .alsungueltigkennzeichnen:IF nichtinknotenTHEN ungueltigmachen(kmind);ELSE kmindknoten:=newrowFI ;CONCR ( km):=null.nichtinknoten:KNOTEN VAR vglknoten,kmknoten;CONCR (kmknoten):=kmind ;read(kmknoten,vglknoten);CONCR (vglknoten)=knindex.END PROC knotenmengeloeschen;KNOTENMENGE PROC exporte:expEND PROC exporte;KNOTENMENGE PROC importe:impEND PROC importe;KNOTENMENGE PROC system:sysEND PROC system; PROC startesystembaum:IF verwaltungdaTHEN nurankoppelnELSE ankoppelnundpermanenteknotenmengenerzeugenFI ;systembaumbehandeln. verwaltungda:exists(verwaltungsname).nurankoppeln:verwaltung:=old( verwaltungsname);CONCR (exp):=kn1;CONCR (imp):=kn2;CONCR (sys):=kn3. ankoppelnundpermanenteknotenmengenerzeugen:verwaltung:=new(verwaltungsname); verwaltung.maxeintrag:=0;verwaltung.ersterfreier:=1;exp:=leereknotenmenge;imp :=leereknotenmenge;sys:=leereknotenmenge.systembaumbehandeln:IF exists( systembaumname)THEN systembaum:=old(systembaumname)ELSE systembaum:=new( systembaumname);systembaum.maxeintrag:=0;systembaum.ersterfreier:=1;FI .END PROC startesystembaum;PROC listederteilbaeume(TEXT CONST dateiname):LONGROW VAR refinements;FILE VAR f:=sequentialfile(output,dateiname);refinements:= verwaltung.tabzeile(CONCR (exporte)-maxkn).knoten;INT VAR i;FOR iFROM 1UPTO length(refinements)REP put(f,verwaltung.tabzeile((refinements_i)-maxkn). attribute);line(f)PER ;close(f)END PROC listederteilbaeume;PROC kopieresystembaum:copy(systembaumname,systembaumkopie);systembaum:=old( systembaumkopie);copy(verwaltungsname,verwaltungskopie);verwaltung:=old( verwaltungskopie)END PROC kopieresystembaum;PROC ueberschreibesystembaum: forget(systembaumname,quiet);rename(systembaumkopie,systembaumname);forget( verwaltungsname,quiet);rename(verwaltungskopie,verwaltungsname)END PROC ueberschreibesystembaum;PROC setzesystembaumzurueck:systembaum:=old( systembaumname);forget(systembaumkopie,quiet);verwaltung:=old(verwaltungsname );forget(verwaltungskopie,quiet)END PROC setzesystembaumzurueck;INT PROC neuereintrag(BOOL CONST istverwaltung,istknoten):EINTRAG VAR e;e.attribute:= niltext;IF istknotenTHEN CONCR (e.vater):=null;ELSE CONCR (e.vater):=knindex FI ;e.knotenmengen:=newrow;e.knoten:=newrow;INT VAR eintragsnr; naechstenfreiensuchen(istverwaltung,eintragsnr);KNOTEN VAR k;CONCR (k):= eintragsnr;write(k,e);eintragsnrEND PROC neuereintrag;OP :=(EINTRAG VAR e, EINTRAG CONST f):CONCR (e):=CONCR (f)END OP :=;PROC naechstenfreiensuchen( BOOL CONST istverwaltung,INT VAR eintragsnr):IF istverwaltungTHEN naechstenfreieninverwaltungsuchen(eintragsnr)ELSE naechstenfreieninsystembaumsuchen(eintragsnr)FI END PROC naechstenfreiensuchen;PROC naechstenfreieninsystembaumsuchen(INT VAR eintragsnr):eintragsnr:=systembaum.ersterfreier;IF systembaum.ersterfreier> systembaum.maxeintragTHEN systembaum.maxeintrag:=systembaum.ersterfreier; systembaum.ersterfreierINCR 1ELSE INT VAR i;FOR iFROM systembaum.ersterfreier +1UPTO systembaum.maxeintragREP IF NOT istgueltigTHEN systembaum.ersterfreier :=i;LEAVE naechstenfreieninsystembaumsuchenFI PER ;systembaum.ersterfreier:= systembaum.maxeintrag+1FI .istgueltig:CONCR (systembaum.tabzeile(i).vater)>= null.END PROC naechstenfreieninsystembaumsuchen;PROC naechstenfreieninverwaltungsuchen(INT VAR eintragsnr):eintragsnr:=verwaltung. ersterfreier+maxkn;IF verwaltung.ersterfreier>verwaltung.maxeintragTHEN verwaltung.maxeintrag:=verwaltung.ersterfreier;verwaltung.ersterfreierINCR 1 ELSE INT VAR i;FOR iFROM verwaltung.ersterfreier+1UPTO verwaltung.maxeintrag REP IF NOT istgueltigTHEN verwaltung.ersterfreier:=i;LEAVE naechstenfreieninverwaltungsuchenFI PER ;verwaltung.ersterfreier:=verwaltung. maxeintrag+1FI .istgueltig:CONCR (verwaltung.tabzeile(i).vater)>=null.END PROC naechstenfreieninverwaltungsuchen;KNOTEN PROC ersternach(INT CONST knindex,LONGROW CONST ordnung):KNOTEN VAR k:=nilknoten;INT CONST l:=length( ordnung);IF (l>0)CAND (knindex=0.uebertrage:EINTRAG VAR e;e.attribute :=verwaltung.tabzeile(i).attribute;e.knotenmengen:=verwaltung.tabzeile(i). knotenmengen;e.vater:=verwaltung.tabzeile(i).vater;e.knoten:=decr(verwaltung. tabzeile(i).knoten);reorg.tabzeile(i):=e.markiere:CONCR (reorg.tabzeile(i). vater):=-1.vorbereitung:DATASPACE VAR ds:=nilspace;reorg:=ds;reorg.maxeintrag :=verwaltung.maxeintrag;reorg.ersterfreier:=verwaltung.ersterfreier.abschluss :forget(verwaltungsname,quiet);copy(ds,verwaltungsname);forget(ds); startesystembaum.END PROC reorganisiereverwaltung;PROC reorganisiere(LONGROW CONST unbenutzte,startknoten):INT VAR i;FOR iFROM 1UPTO length(unbenutzte) REP reorganisiere(knoten,name)PER .knoten:KNOTEN :(startknoten_i).name:TEXT VAR na;read(KNOTEN :(unbenutzte_i),na);na.END PROC reorganisiere;PROC reorganisiere(KNOTEN CONST k,TEXT CONST teilbaumname):line;put("Teilbaum "+ teilbaumname+" wird reorganisiert");reorganisiere(k)END PROC reorganisiere; PROC reorganisiere(KNOTEN CONST k):vorbereitung;erstenaufstack;REP stackbearbeitungUNTIL stackleerPER .stackbearbeitung:nimmoberstenvomstack;IF (NOT oberstermarkiert)CAND hatsoehneTHEN markiertzurueck; allesoehneaufdenstackELSE oberstenuebertragenFI .vorbereitung:STACK VAR s:= leererstack.erstenaufstack:TUPEL VAR tup;IF schonmalerreicht(k)THEN LEAVE reorganisiereELSE tup.kn:=k;tup.index:=naechsterindex;tup.markiert:=false; alserreichtkennzeichnen(k);vater.kn:=systembaum.tabzeile(CONCR (k)).vater; vater.index:=CONCR (vater.kn);hauptindexaendern(tup,vater);push(s,tup)FI . stackleer:leer(s).nimmoberstenvomstack:TUPEL VAR vater;pop(s,vater). oberstermarkiert:vater.markiert.markiertzurueck:vater.markiert:=true;push(s, vater).hatsoehne:KNOTENMENGE VAR soehne;read(vater.kn,soehne);INT VAR sohnzahl:=zahlderelemente(soehne);sohnzahl>0.oberstenuebertragen:uebertrage( vater).allesoehneaufdenstack:INT VAR i;LONGROW VAR sohnverzeichnis:= systembaum.tabzeile(CONCR (soehne)).knoten;tup.markiert:=false;FOR iFROM 1 UPTO sohnzahlREP holesohn;IF NOT (schonmalerreicht(sohn))THEN itersohnaufstackELSE indexaendern(s,vater,sohn)FI PER .holesohn:KNOTEN VAR sohn;CONCR (sohn):=sohnverzeichnis_i.itersohnaufstack:tup.kn:=sohn;tup.index :=naechsterindex;IF isrefinement(sohn)THEN alserreichtkennzeichnen(sohn)FI ; hauptindexaendern(tup,vater);push(s,tup).END PROC reorganisiere;BOOL PROC schonmalerreicht(KNOTEN CONST k):is(k,erreichtkz)END PROC schonmalerreicht; BOOL PROC isrefinement(KNOTEN CONST k):is(k,refkz)END PROC isrefinement;BOOL PROC is(KNOTEN CONST k,TEXT CONST muster):is(attribute(k),muster)END PROC is; BOOL PROC is(TEXT CONST k,TEXT CONST muster):(subtext(k,1,1)=muster)END PROC is;PROC alserreichtkennzeichnen(KNOTEN CONST k):replace(systembaum.tabzeile( CONCR (k)).attribute,1,erreichtkz)END PROC alserreichtkennzeichnen;TEXT PROC attribute(KNOTEN CONST k):systembaum.tabzeile(CONCR (k)).attributeEND PROC attribute;INT PROC naechsterindex:reorg.maxeintragINCR 1;reorg.ersterfreier INCR 1;cout(reorg.maxeintrag);reorg.maxeintragEND PROC naechsterindex;PROC uebertrage(TUPEL CONST tup):EINTRAG VAR e;INT VAR knummer:=CONCR (tup.kn);e. attribute:=systembaum.tabzeile(knummer).attribute;e.vater:=systembaum. tabzeile(knummer).vater;e.knotenmengen:=decr(systembaum.tabzeile(knummer). knotenmengen);e.knoten:=decr(systembaum.tabzeile(knummer).knoten);IF schonmalerreichtTHEN replace(e.attribute,1,refkz)FI ;reorg.tabzeile(tup.index ):=e;CONCR (systembaum.tabzeile(knummer).vater):=tup.index.schonmalerreicht: is(e.attribute,erreichtkz).END PROC uebertrage;PROC hauptindexaendern(TUPEL CONST tup,TUPEL CONST vater):INT VAR knummer:=CONCR (tup.kn);LONGROW VAR knotenmengen:=systembaum.tabzeile(knummer).knotenmengen;INT VAR i;FOR iFROM 1 UPTO length(knotenmengen)REP IF verwaltungodervaterTHEN indexaendern(knummer, tup.index,iteknotenmenge,vater.index)FI PER .verwaltungodervater:INT VAR iteknotenmenge:=knotenmengen_i;(iteknotenmenge>maxkn)COR (iteknotenmenge= CONCR (vater.kn)).END PROC hauptindexaendern;PROC indexaendern(STACK CONST s, TUPEL CONST vater,KNOTEN CONST sohn):INT VAR neuersohnindex:=CONCR ( systembaum.tabzeile(CONCR (sohn)).vater);IF nochaufstackTHEN sucheneuensohnindexFI ;indexaendern(CONCR (sohn),neuersohnindex,CONCR (vater. kn),vater.index);reorg.tabzeile(neuersohnindex).knotenmengen:=decr(systembaum .tabzeile(CONCR (sohn)).knotenmengen).nochaufstack:(neuersohnindex>maxkn). sucheneuensohnindex:search(s,CONCR (sohn),neuersohnindex);.END PROC indexaendern;PROC indexaendern(INT CONST alterindex,nind,knalt,kneu):INT VAR neuerindex:=nind+reorgincr,knneu:=kneu+reorgincr;IF knalt<=maxknTHEN possystemELSE errechneposition;posverwaltung;FI .possystem:INT VAR ps:=pos( systemknoten,alterindex);replace(systemknoten,ps,neuerindex);replace( systemknotenmengen,knpos,knneu).systemknoten:systembaum.tabzeile(knalt). knoten.systemknotenmengen:systembaum.tabzeile(alterindex).knotenmengen.knpos: pos(systemknotenmengen,knalt).errechneposition:INT CONST position:=knalt- maxkn.posverwaltung:INT VAR pv:=pos(verwaltungsknoten,alterindex);replace( verwaltungsknoten,pv,neuerindex).verwaltungsknoten:verwaltung.tabzeile( position).knoten.END PROC indexaendern;LONGROW PROC decr(LONGROW CONST l): LONGROW VAR row:=newrow;INT VAR i;FOR iFROM 1UPTO length(l)REP rowCAT ((l_i) MOD reorgincr)PER ;rowEND PROC decr;STACK PROC leererstack:STACK VAR s;s.top :=bottom;sEND PROC leererstack;OP :=(TUPEL VAR ziel,TUPEL CONST quelle): CONCR (ziel):=CONCR (quelle)END OP :=;OP :=(STACK VAR ziel,STACK CONST quelle ):CONCR (ziel):=CONCR (quelle)END OP :=;PROC push(STACK VAR s,TUPEL CONST k): IF NOT (s.top=maxhoehe)THEN s.st(s.top):=k;s.topINCR 1ELSE errorstop( "Stacküberlauf")FI END PROC push;PROC pop(STACK VAR s,TUPEL VAR k):IF NOT (s. top=bottom)THEN s.topDECR 1;k:=s.st(s.top)ELSE errorstop("Stackunterlauf")FI END PROC pop;PROC search(STACK CONST s,INT CONST index,INT VAR neuersohnindex ):INT VAR i:=0;REP iINCR 1;IF i>s.topTHEN errorstop("Rekursionsauflösung: "+ text(index)+" nicht auf stack")FI UNTIL CONCR (s.st(i).kn)=indexPER ; neuersohnindex:=s.st(i).indexEND PROC search;INT PROC hoehe(STACK CONST s):s. top-1END PROC hoehe;BOOL PROC voll(STACK CONST s):s.top=maxhoeheEND PROC voll ;BOOL PROC leer(STACK CONST s):s.top=bottomEND PROC leer;END PACKET systembaum;