Gå til innhold

[Løst]Linket-liste problem med "Rewind funksjonen"


Anbefalte innlegg

Hei.

 

Jeg har nå satt meg ned for å lære meg C++, har vært borti en del vanlig C før, og ting blir derfor av og til litt låst i vanlig C løsninger, selv om det ofte skal være det samme. Etter en del feilsøking tror jeg har kommet frem til hva feilen er, men forstår ikke hvorfor den oppstår.

 

Enkelt og greit forklar:

Jeg blar gjennom listen til et eller annet punkt og skriver ut elementene til console.

Så tar jeg Rewind-funksjonen for å starte på begynnelsen og skrive ut ellementene til et gitt tilfeldig punkt. Det som da skjer er at den skriver ut første tabell og fortsetter der den slapp. Når jeg seg i debuggeren ser jeg enkelt og greit at cur->next peker til det elementet, som i og for seg er logisk siden den går til den etterpå. Jeg forstår ikke hvorfor denne gjør det, når den burde peke på det andre elementet i listen?

 

Jeg regner med at feilen ligger i list.cpp i en av funksjonene som ikek håndterer pekerne ordentlig. Men jeg klarer ikke helt se hvorfor, i debuggeren ser det ut som *First (pekeren som skal peke til første element) peker til riktig element hele tiden, og first->next peker til det andre elementet.

 

List.h

struct node {
void *item;
node *next;
};

class List {
public:
List(); // Constructor
~List(); // Deconstructor
int NumItems(); // Returnerer antall elementer
void AddFirst(void *item); // Legger en ting til i begynnelsen
void Delete(); // Sletter nåværende element
void Next(); // Går til neste element
void Rewind(); // Går til starten
void* GetItem(); // Returnerer "item"
private:
node *first;
node *prev;
node *cur;
int numitems;
};

 

list.cpp

http://pastebin.com/m2bb488a9

 

Takker for all hjelp som dere kan gi. Og håper på å få løst problemet, men siden dette er noe jeg bare gjør på fritiden er jeg ikke bare ute etter å løse problemet men også forstå HVORFOR det ikke funker slik at jeg slipper fremtidige problemer som dette. Derfor hade jeg blitt veldig glad for en forklaring.

 

Legger ved pastebin av de andre filene tilfelle dere trenger å se de, men regner med disse funker som de skal.

 

deck.cpp og deck.h: http://pastebin.com/m2deab3e0

main.cpp: http://pastebin.com/m7318e444

Endret av etse
Lenke til kommentar
Videoannonse
Annonse

Etter å ha klødd meg mye i hode kom jeg frem til at jeg hadde gjort en veldig elementær feil som skapte mye problemer, så det ble en del omskriving av koden. Siden det kan komme flere som får samme problemet senere skal jeg skrive ned en kort forklaring.

 

Som dere kan se i koden har jeg "Cur", "Prev" og "first" som skal være pekere til første, forrige, og nåværende node i listen. Da disse bare var pekere skapte det problemer sammen med rewind funksjonen som bare sa cur = first. Dette gjorde at de da ville i hovedsak være samme minneblokk, og ikke bare peke på samme element. Dette kunne løses på to forskjellige måter, med å f.eks. enten si cur = *first, eller med andre cur "adressen pekt på i first". Men jeg valgte å gå for en litt annen løsning og lagde helt egne noder for first, cur og prev. Og bruke "->next" til å holde elementetj eg pekte på. Når jeg da skulle hente ut en ting fra listen bruker jeg cur->next->item.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...