Linked list og dynamisk hukkomelse?

Tags:    c++

Jeg har arbejdet på et lille program der bruger en linked list til at gemme noget user input. Jeg har brugt new og delete til at allokere hukkomelse til mine nodes. Jeg har et loop der allokerer en node af gangen indtil det ønskede antal er opnået, på den måde kan jeg også sørge for at mine nodes "hænger sammen" og at den sidste node peger på NULL.

Problemet er bare hvis programmet får besked på af brugeren til at lave en meget lang liste, 10000 nodes f.eks. Istedet for at smide en overflow exception, begynder mit program bare at oprette nodes en af gangen, fordi at jeg jo ikke allokerer dem samtidigt, og der kommer ikke nogen overflow error før grænsen er nået, altså hvis mit system kan håndtere 9000 nodes, og programmet forsøger at oprette 9200 nodes, opdager mit program det ikke før der alleredde er blevet oprettet 9000 nodes. Det tager meget lang tid og gør systemet ret ustabilt.

Det er egentlig ikke noget problem for det er ikke et program jeg skal distribuere til andre end mig selv og der er aldrig nogen der får brug for at oprette så mange nodes, men det er jo stadig rart at vide hvad man skal gøre i sådan en situation, så jeg kunne sådan set ret godt tænke mig at finde en løsning.

Her er koden til det struct jeg bruger til mine nodes, samt det loop der opretter listen.

Fold kodeboks ind/udKode 


Fold kodeboks ind/udKode 


n er antallet af nodes der skal oprettes, conductor er den pointer jeg bruger til at traverse min liste, og i er bare min index variabel.

Hvordan kan jeg ændre min kode så hele listen bliver oprettet med en enkelt "new"? Jeg skal jo stadig have listen "sat sammen", og jeg er ikke helt sikker på hvordan jeg skal gøre?

Tak for hjælpen :)



Kan du fortælle hvordan data'en bliver sat ind i listen? Skal brugeren taste noget data, linje for linje. Skal han angive hvor mange noder han vil have ind? Osv.



Ja, han angiver på kommandolinjen hvor mange nodes han skal have når han starter programmet. Så looper den igennem alle nodes og promtper for input. Det virker sådan set helt fint, problemet opstår bare hvis man beder om et meget højt antal nodes.



Indlæg senest redigeret d. 10.08.2007 23:05 af Bruger #12292
Kan du så ikke bare lave en if, som tjekker om antallet er under et bestemt tal? Hvis det er, så kører den videre - hvis ikke, så spørger den en gang til?



Oh. Det havde jeg lige overset i kampens hede, men som Niklas Hansen siger, så er en if-sætning en mulig løsning.



Men problemet ligger vel i at du vil have programmet til at fortælle dig om der, på forhånd, er plads til de mange Nodes? Kunne man lave en simuleret udregning på hvor meget diskplads der var og hvor meget, alle noderne fyldte til sammen?



Indlæg senest redigeret d. 11.08.2007 00:29 af Bruger #1151
Jeg ville løse problemet ved at allokere én kæmpe stor block, på sizeof(Node)*n. At bruge new for hver gang en ny del af listen oprettes er ikke en god ting. Hvis new kaldet til dette fejler, så ved du at listen ikke kan oprettes.



@Niklas Hansen:

Ja men hvilket tal skal jeg så sammenligne med? Mængden af fri hukommelse varierer jo fra maskine til maskine og er afhængigt af alt muligt, så er det ikke lidt en nødløsning?

@The Freak:
Ja, mit problem er så bare at jeg ikke er helt sikker på hvordan jeg så gør dette og samtidigt bevarer min liste, altså sådan at pointersne i mine nodes stadig peger de rigtige steder hen, og at slutningen af listen ender med NULL, kan du ikke give et eksempel på hvordan du ville gøre det?



Uf, nu har jeg ikke arbejdet med C eller C++ i lang tid efterhånden, men tanken var at man allokerede et data område, stort nok til alle posterne. Så looper man igennem med noget i denne her stil:
Fold kodeboks ind/udKode 

Hæng mig ikke op på eventuelle fejl i koden, der må du spørge nogen af de andre, men håber konceptet kom frem :)



@The-Freak:

Jeg har prøvet at bruge dit eksempel i mit program, og det compiler fint, men det virker ikke længere som det skal, her er den kode jeg bruger:

Fold kodeboks ind/udKode 


Passer det ikke meget godt med det du mente? Når jeg gennemgår listen, efter jeg har inputtet værdier til mine nodes, og printer dem til skærmen, får jeg kun de 2 første værdier at se. Men da jeg gjorde det før jeg ændrede koden, virkede det fint, hvad kan der være galt?

Jeg er heller ikke helt sikker på at jeg forstår koden, og jeg må indrømme at jeg ikke er helt vild med at lave programmer jeg ikke forstår, syntes ikke jeg lærer noget af det. I den linje jeg har markeret i kode boksen, er det da addressen af pointeren conductor jeg øger med størrelsen på mine nodes gange n? Hvis ja så tror jeg godt jeg forstår idéen, men jeg var bare ikke klar over man sådan kunne øge addresserne i hukkomelsen på den måde.

Hvad med koden i if blocken? Hvad gør den godt for, kan ikke lige gennemskue det?



t