2009-04-23 8 views
0

Ich bin eine rekursive Funktion in einer Liste mit (mit ADT-Datei), indem Sie die Suchfunktion zu modifizieren und das Hinzufügen von Funktion Druck:Pointers und Rekursion

template <class TYPE, class KTYPE> 
bool List<TYPE, KTYPE> :: _search (NODE<TYPE> **pPre, 
            NODE<TYPE> **pLoc, 
            KTYPE  key) 
{ 
    if ((*pLoc) == NULL) 
     return false; 
    else 
     if (key == (*pLoc)->data.key) 
      return true; 

      _search ((*pPre)->link ,(*pLoc)->link, key); 

      return false; 
} 

template <class TYPE, class KTYPE> bool List<TYPE, KTYPE> :: _search (NODE<TYPE> **pPre, NODE<TYPE> **pLoc, KTYPE key) { if ((*pLoc) == NULL) return false; else if (key == (*pLoc)->data.key) return true; _search ((*pPre)->link ,(*pLoc)->link, key); return false; } 

Aber ich erhalte eine Fehlermeldung in

_search ((*pPre)->link ,(*pLoc)->link, key); 

der Fehler:

error C2664: 'List<TYPE,KTYPE>::_search' : cannot convert parameter 1 from 'NODE<TYPE> *' to 'NODE<TYPE> **' 

Ich weiß nicht warum? Ich habe versucht, hinzuzufügen und wegzunehmen *, aber ich verstehe es immer noch nicht richtig.

und ich initialisieren:

NODE <TYPE> * pPre; 
    pPre = NULL; 
    NODE <TYPE> * pLoc ; 
    pLoc = NULL; 

NODE <TYPE> * pPre; pPre = NULL; NODE <TYPE> * pLoc ; pLoc = NULL; 

bevor die Funktion aufgerufen wird

diese Funktion den Standort von pPRE und ploc im Speicher zurück, so dass die Funktion Unterschrift muss ** verwenden.

Ich weiß, ich muss ändern, wie ich es nenne, aber wie?

template <class TYPE> 
    struct NODE 
     { 
     TYPE data; 
     NODE *link; 
     }; 

    struct Student 
     { 
     string name ; 
     int level; 
     int key; 
     }; 

template <class TYPE, class KTYPE> 
    class List 
     { 
     private: 
      NODE<TYPE> *head; 
      NODE<TYPE> *pos; 
      NODE<TYPE> *rear; 
      int   count; 
        .... 
        .... 
        .... 
        .... 
        .... 

}; 

template <class TYPE> struct NODE { TYPE data; NODE *link; }; struct Student { string name ; int level; int key; }; template <class TYPE, class KTYPE> class List { private: NODE<TYPE> *head; NODE<TYPE> *pos; NODE<TYPE> *rear; int count; .... .... .... .... .... }; 


ostream & operator << (ostream & out , Student & Data) 
{ 
    out << "The name is : " << Data.name << "\nThe Level is : " << Data.level<< "\nThe ID is :"<<Data.key; 
    return out; 
} 

template<class TYPE, class KTYPE> 
void List <TYPE, KTYPE > :: ReversePrint (NODE <TYPE> * node) 
{ 
if (node== NULL) 
     return ; 

ReversePrint (node->link); 

cout << node-> data; 

    return ; 
} 

Antwort

2
_search ((*pPre)->link ,(*pLoc)->link, key); 

Der erste Parameter ist vom Typ Zeiger auf NODE während es ein Zeiger auf einen Zeiger auf NODE sein sollte.

0
_search ((*pPre)->link ,(*pLoc)->link, key); 

Änderung der oben:

_search (&(*pPre)->link ,(*pLoc)->link, key); <== see & in first parameter 

Es erste Parameter erfordert NODE-Zeiger *

EDIT: nach dem Code nach EDIT Überprüfung sieht es sowohl wie 1. und 2. der Parameter, die an _search übergeben werden, sind nicht korrekt. Die Methode benötigt einen Zeiger auf den Zeiger auf NODE. Daher ist die korrekte Art der Parameterübergabe:

_search (&(*pPre)->link , &(*pLoc)->link, key);