Re: [C++]Linked List class implementatie loopt vast

Status
Niet open voor verdere reacties.

Joshua822

Gebruiker
Lid geworden
17 apr 2008
Berichten
306
Hallo iedereen.

Ik heb een probleem. Ik ben een class aan het schrijven waarmee ik makkelijk en generiek ( de enige voorwaarde is dat in elke struct er een pointer is met de identifier "next" ) linked lists kan beheren ( ja, er zijn veel betere implementaties beschikbaar op het internet, maar dit is gewoon voor educatieve doeleinden ).

Nu ja, ik heb al zo vaak linked lists geschreven dat ik ondertussen wel begrijp hoe ik de meeste standaard handelingen op deze op een goede manier moet uitvoeren.

[cpp]
#include <iostream>

struct node{
unsigned short val;
struct node* next;
};
template <class T> class linked_list{
T* baseptr;
T* pos;
public:
linked_list(T * a){baseptr=new T;}
void tr(){
while(pos->next)pos=pos->next;
}
void gtn(unsigned short num){
pos=baseptr;
unsigned short i;
for(i=0;i<num;i++){
if(pos->next)pos=pos->next;
else break;
}
}
void addn(){
tr();
pos->next=new T;
}
void addnb(unsigned short num){
gtn(num);
T* TempPtr=pos->next;
pos->next=new T;
pos->next->next=TempPtr;
}
void del(){
pos=baseptr;
while(pos){
T* ToDel=pos;
pos=pos->next;
delete ToDel;
}
}
void deln(){
tr();
delete pos;
}
void delnb(unsigned short num){
gtn(num);
T* TempPtr=pos->next->next;
delete pos->next;
pos->next=pos->next->next;
}
};
int main(){
struct node a;
linked_list<struct node>ll(&a);
ll.del();
std::getchar();
return 0;
}[/cpp]


Ik denk dat er een probleem is met de tr() functie van de class, dat deze op een of andere manier oneindig loopt, want als ik in de verschillende functies een controle "std::cout" statement uitvoer, krijg ik de uitvoer wel, maar alleen niet bij de functie tr() van de class.

Alvast bedankt voor het meedenken !
 
Laatst bewerkt door een moderator:
Er staan een aantal essentiële fouten in je code. Om te beginnen:[CPP]struct node{
unsigned short val;
struct node* next;
};[/CPP]
struct is een keyword, vergelijkbaar met het keyword class. Uit wat je schrijft vermoed ik dat de struct de bedoeling heeft om een waarde bij te houden, en een pointer naar de volgende struct van datzelfde type (namelijk het type node). In dat geval wordt je definitie als volgt:
[CPP]struct node {
unsigned short val;
node* next;
};[/CPP]
voor wat eenvoudige voorbeelden zie ook de onderste 2 examples op cprogramming.com - Structures
Daar zie je ook dat je main-functie dezelfde steek laat vallen:[CPP]int main(){
struct node a;
linked_list<struct node>ll(&a);
ll.del();
std::getchar();
return 0;
}[/CPP]wordt dan[CPP]int main(){
node a;
linked_list<node>ll(&a);
ll.del();
std::getchar();
return 0;
}[/CPP]

Alleen denk ik dat je hier je design wat dient aan te passen indien je inderdaad een generieke linked list wil maken.. Want stel nu dat ik schrijf: [CPP]linked_list<int> ll;[/CPP] dan merk je dat een integer helemaal geen pointer naar de volgende integer bevat...
Om dat op te lossen zal je dus je linked list de nodes moeten laten aanmaken (en worden je nodes ook generieke nodes door gebruik te maken van de template class) wanneer een nieuw item wordt toegevoegd. Het doel in de main-code wordt dan iets als:[CPP]int main (int argc, char** argv)
{
int i = 5;
linked_list<int> ll();
ll.add(i);
ll.add(-42);
ll.print() //functie die een cout doet van alle aanwezig items
std::getchar();
return 0;
}[/CPP]
De nieuwe nodes worden dus pas aangemaakt in de add-methode van je linked list. Ook zie je dat ik hier geen ll.del() in de code heb gezet. Dit omdat deze functie eigenlijk in de destructor van je linked list zou moeten komen, waarna ze hier automatisch wordt uitgevoerd bij het beëindigen van je programma.

Als je er niet uitkomt, post dan maar wat je allemaal geprobeerd hebt, en dan helpen we je vanaf daar wel weer verder op weg.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan