Ovaj kod ne radi:
Code:
#include <iostream>
using namespace std;
class List
{
public:
int data;
List * pNext;
List() : data(0), pNext(0) {}
List(int d) : data(d), pNext(0) {}
};
void AddNode(List * pHead, int data)
{
List * n = new List(data);
if(!pHead)
{
pHead = n;
return;
}
AddNode(pHead->pNext, data);
}
void Stampaj(List * pHead)
{
if(pHead)
{
cout << pHead->data << endl;
}
if(pHead->pNext)
Stampaj(pHead->pNext);
}
void main()
{
List * pHead = 0;
AddNode(pHead, 3);
Stampaj(pHead);
}
#include <iostream>
using namespace std;
class List
{
public:
int data;
List * pNext;
List() : data(0), pNext(0) {}
List(int d) : data(d), pNext(0) {}
};
void AddNode(List * pHead, int data)
{
List * n = new List(data);
if(!pHead)
{
pHead = n;
return;
}
AddNode(pHead->pNext, data);
}
void Stampaj(List * pHead)
{
if(pHead)
{
cout << pHead->data << endl;
}
if(pHead->pNext)
Stampaj(pHead->pNext);
}
void main()
{
List * pHead = 0;
AddNode(pHead, 3);
Stampaj(pHead);
}
Greska je u AddNode funkciji... Ona bi trebala ovako da bude napisana:
Code:
List * AddNode(List * pHead, int data)
{
List * n = new List(data);
if(!pHead)
{
pHead = n;
return pHead;
}
pHead->pNext = AddNode(pHead->pNext, data);
return pHead;
}
List * AddNode(List * pHead, int data)
{
List * n = new List(data);
if(!pHead)
{
pHead = n;
return pHead;
}
pHead->pNext = AddNode(pHead->pNext, data);
return pHead;
}
'Idealno' resenje za ovo je:
Code:
#include <iostream>
using namespace std;
class List
{
public:
int data;
List * pNext;
List() : data(0), pNext(0) {}
List(int d) : data(d), pNext(0) {}
};
void AddNode(List ** pHead, int data)
{
List * n = new List(data);
if(!*pHead)
{
*pHead = n;
return;
}
AddNode(&((*pHead)->pNext), data);
}
void Stampaj(List * pHead)
{
if(pHead)
{
cout << pHead->data << endl;
}
if(pHead->pNext)
Stampaj(pHead->pNext);
}
void main()
{
List * pHead = 0;
AddNode(&pHead, 3);
AddNode(&pHead, 4);
Stampaj(pHead);
}
#include <iostream>
using namespace std;
class List
{
public:
int data;
List * pNext;
List() : data(0), pNext(0) {}
List(int d) : data(d), pNext(0) {}
};
void AddNode(List ** pHead, int data)
{
List * n = new List(data);
if(!*pHead)
{
*pHead = n;
return;
}
AddNode(&((*pHead)->pNext), data);
}
void Stampaj(List * pHead)
{
if(pHead)
{
cout << pHead->data << endl;
}
if(pHead->pNext)
Stampaj(pHead->pNext);
}
void main()
{
List * pHead = 0;
AddNode(&pHead, 3);
AddNode(&pHead, 4);
Stampaj(pHead);
}
Mozda sam nesge pogresio ali, glavni problem je:
U prvom primeru, pHead ostaje NEPROMENJEN...
U drugom primeru, gde funkcija AddNode vraca pHead, on se menja i u glavnom programu.
U trecem primeru se pHead menja i bez vracanja iz funkcije...
Zasto je ovde potrebno raditi sa 'dvostrukim' pokazivacima da bi pNode bio promenjen u funkciji kada je i on sam, pokazivac?
EOF