[ glorius @ 06.12.2007. 11:26 ] @
Evo jednog standardnog primera izgradnje liste: 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); } 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; } '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); } 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? |