Page 1 of 1

[GS] Pointer van een boom NIL maken in een methode

Posted: Thu Mar 05, 2009 9:22 pm
by Glenn
Hoi allen,

Weet er soms iemand hoe ik een pointer NIL kan maken in mijn methode ReplaceElement? Als ik als replacementElement NIL meegeef crasht hij. Dit gebeurt bij binTree^ := replacementElement^ en ik denk dat het komt omdat NIL geen inhoud heeft. Weet er iemand hoe ik dat kan oplossen? Ik wil namelijk hebben dat mijn binTree wijst. Hoe kan ik dat oplossen?

Wel vervelend dat je in oberon in de receiver precies geen VAR kan plaatsen...

Code: Select all


PROCEDURE (binTree : BinaryTree) ReplaceElement (key : INTEGER; replacementElement : BinaryTree);
(* We zoeken via deze methode een bepaalde key, wanneer we de key gevonden hebben zetten we bij het element met die key het replacementElement in de plaats *)

BEGIN
OutExt.String("Ingang procedure");
IF (key = binTree^.key) THEN
binTree^ := replacementElement^;
ELSIF (key < binTree^.key) THEN
IF binTree^.leftchild # NIL THEN
binTree.leftchild^.ReplaceElement(key, replacementElement);
END;
ELSE
IF binTree^.rightchild # NIL THEN
binTree.rightchild^.ReplaceElement(key, replacementElement);
END;
END;
END ReplaceElement;
Sorry voor mijn vele programmeervragen maar op sommige momenten zit je gewoon echt stokvast :P .

Groetjes,
Glenn

Posted: Fri Mar 06, 2009 2:58 pm
by Glenn
Ik heb er vandaag op de unif over gepraat en heb een oplossing gevonden :). Dus deze topic mag weg ;).

Posted: Fri Mar 06, 2009 3:59 pm
by Robbe
Glenn wrote:Ik heb er vandaag op de unif over gepraat en heb een oplossing gevonden :). Dus deze topic mag weg ;).
Ge gaat toch ni de vervelende noob uithangen en u antwoord hier ni posten? ;)

Posted: Fri Mar 06, 2009 5:26 pm
by racekakje
Maakt toch gewoon een Procedure "FindElement" en 2 aparte "Replace" en "Delete". Want als ge kunt toch ni zomaar deleten in nen boom, het kan zijn da der nog kinderen zijn..

Posted: Sat Mar 07, 2009 10:20 pm
by Glenn
Sorry Robbe, hier komt het antwoord :). In mijn PROCEDURE RemoveElement get ik het element dat men wil verwijderen. Ik kijk dan na of:
a) het element geen kinderen heeft ((element^.leftchild = NIL) & (element^.rightchild = NIL)
b) het element 1 linkerkind heeft
c) het element 1 rechterkind heeft
d) het element 2 kinderen heeft

Ik zat dus vast in het geval a. De oplossing is de volgende. Ik kijk eerst of de hoogte # 1, als de hoogte verschillend is van 1 zijn we sowieso ni aan ons laatste element (= het normale geval). Als we niet aan ons laatste element zijn, en dus gewoon ergens een blad in een boom moeten verwijderen, dan roep ik de methode SetNil op.

Deze methode zet dus een bepaald element met een bepaalde key op NIL.

SetNil is dus de sleutel tot de oplossing. Deze kijkt of de sleutel gelijk is aan de sleutel van het linkerkind, zoja, dan moet dat linkerkind op NIL gezet worden en is onze missie geslaagd.
Vervolgens kijkt hij of de sleutel gelijk is aan de sleutel van het rechterkind, zoja, dan moeten we het rechterkind op NIL zetten en is onze missie geslaagd.

Als onze missie nog niet geslaagd is, dan kijken we of we verder moeten zoeken in de linker of rechterdeelboom door de opgegeven sleutel te vergelijken met binTree^.key . De hele procedure werkt recursief en na een tijd vinden we het blad sowieso :).

Posted: Sun Mar 08, 2009 11:39 pm
by Robbe
Glenn wrote:Sorry Robbe, hier komt het antwoord :)
Daar gaan de volgende generaties blij mee zijn ^^

Werkt het ook nog als je 4,3,5,1,2,7,4.5 toevoegd (in die volgorde) en dan 4 wilt verwijderen?

Posted: Fri Mar 20, 2009 5:11 pm
by Glenn
Sorry voor het late antwoord. Ik kan geen kommagetallen invoeren. Maar als ik 4, 3, 5, 1, 2, 7 en 4 achtereenvolgens invoer en vervolgens 4 probeer te verwijderen klopt het resultaat jammer genoeg niet meer :(. Ik had het dus beter moeten testen. Ik ging er vanuit dat de test die Patricia gaf voldoende was, maar dat was blijkbaar niet het geval.

Posted: Fri Mar 20, 2009 5:38 pm
by Pieter Belmans
Robbe bedoelt inderdaad een rij van integers. En dan kunt ge gan debuggen nu ;).

Posted: Fri Mar 20, 2009 6:54 pm
by nasam
Pieter Belmans wrote:Robbe bedoelt inderdaad een rij van integers. En dan kunt ge gan debuggen nu ;).
Als laatste werd wel 4.5 toegevoegd...


4,3,2 is ook een beetje een vreemd kommagetal...

Posted: Fri Mar 20, 2009 7:00 pm
by Pieter Belmans
Vermenigvuldig al die getallen dan met 2. Opgelost!

Ik ging er vanuit dat die test vooral ging over wortels verwijderen.

Posted: Sun Mar 22, 2009 11:34 pm
by Robbe
Pieter Belmans wrote:Robbe bedoelt inderdaad een rij van integers. En dan kunt ge gan debuggen nu ;).
Ik bedoelde een rij van floating point getallen. Normaal zou dat niet veel extra werk mogen zijn!

Posted: Mon Mar 23, 2009 7:03 am
by Pieter Belmans
Floating point is gewoon vermenigvuldigen met een voldoende grote macht van 2 om een geheel getal te krijgen, klaar ;).

Posted: Mon Mar 23, 2009 2:41 pm
by Robbe
Pieter Belmans wrote:Floating point is gewoon vermenigvuldigen met een voldoende grote macht van 2 om een geheel getal te krijgen, klaar ;).
het gaat hem niet om die specifieke getallen, het gaat hem om de relaties tussen de objecten. Zolang er op die objectruimte een orderelatie is, maakt het geen zak uit of het over reƫle getallen, koeien, auto's, planeten, batterijen ... gaat.