[c++]bortagning från dubbellänkad lista

Permalänk
Medlem

[c++]bortagning från dubbellänkad lista

Tjena!
Sitter o försöker fixa en funktion som ska returera värdet för den första noden och sedan ta bort den.
Min lista är en dubbellänkad lista utan en "last pekare" utan den har bara en first.
Jag tycker att min kod ser bra ut, dock så håller inte VS med mig..

T result; if(this->first!=NULL) { Node * temp=this->first; result = this->first->value; this->first=this->first->next; this->first->prev = NULL; delete temp; this->nrOfNodes--; } else result=-1; return result;

konsolen krashar och när jag debbugar så ser jag att det är nåt fel med

this->first->prev = NULL;

.

Tacksam för all hjälp!

Permalänk
Hedersmedlem

Om listan har färre än två element kommer
this->first
först sättas till
this->first->next;
(som antagligen är NULL)
vilket innebär att
"this->first"
i
this->first->prev
också är NULL.

Permalänk
Medlem

Det enklaste om man inte förstår problemet är att rita upp på papper, sedan stega med debuggern och rita pilar och gå igenom.

Permalänk
Medlem
Skrivet av Elgot:

Om listan har färre än två element kommer
this->first
först sättas till
this->first->next;
(som antagligen är NULL)
vilket innebär att
"this->first"
i
this->first->prev
också är NULL.

Jag trodde att jag hade försökt alla möjliga varianter efter tre nedkladdade A4 men icke...

tack för hjälpen ser ut som det funkar som det ska nu.

Permalänk
Medlem

Tjena!
Jag har gjort en dubbelänkad lista och lagt till några noder, sen har jag gjort en funktion som bara ska stega igenom listan och skriva ut alla noders närde. Allt såg ut o funka fint tills jag insåg att elementen jag lägger till i listan läggs alltid i en stigande ordning, dvs att det går att lägga till 1,2,3 men om jag försöker lägga till 3,2,1 så kan jag bara se 3an vid anropet av show funktionen, men mitt nrOfElements ökar till 3, så jag tror att det är nåt fel på länkningen mellan noderna eller att jag inte tänkt på nåt special fall.

{ Node *e=new Node (item); if(this->currOrder==SHRINK) { if(this->first!=NULL) { if(this->first->value<item) { e->next=this->first; this->first=e; this->first->prev = NULL; (this->first->next)->prev=this->first; } else { Node * walker=this->first; while(walker->next!=NULL&&item<walker->next->value) walker=walker->next; e->next=walker->next; if(walker->next!=NULL) { (e->next)->prev=e; } e->prev=walker; walker=e; //delete walker; } } else { e->next = this->first; this->first=e; this->first->prev = NULL; } this->nrOfNodes++; } }

Eftersom det funkar när jag lägger elementen i en "stigande ordning" så tror jag att det är något fel i den kursiva else-satsen.
Själv så tycker jag det värkar bra och när jag ritar så ser det bra ut också.

Tack på förhand!

kopiering
Permalänk
Medlem

edit : läste frågan fel
Återkommer..

Edit2 :

Såvitt jag kan se så kopplar du (i din kursiva else sats) aldrig om pekaren walker->next. Den pekar förbi ditt "nya" element.
Fattas alltså raden walker->next = e.
Byt ut "walker=e" mot "walker->next = e" så borde det fungera.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem

Man tackar!
det gjorde susen!