2009-04-23 6 views
0

J'utilise une fonction récursive dans une liste (avec le fichier ADT) en modifiant la fonction de recherche et l'ajout de la fonction d'impression:Pointeurs et récursion

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; } 

Mais je reçois une erreur dans

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

l'erreur:

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

Je ne sais pas pourquoi? J'ai essayé d'ajouter et de retirer * mais je ne comprends toujours pas.

et je lsinitialisez:

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

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

avant que la fonction est appelée

cette fonction retourne l'emplacement du PPRE et Ploc en mémoire, la signature de la fonction doit utiliser **.

Je sais que je dois changer la façon dont je l'appelle, mais comment?

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 ; 
} 

Répondre

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

Le premier paramètre est de pointeur de type à NODE alors qu'il devrait être un pointeur vers un pointeur vers NODE.

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

changement ci-dessus à:

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

Il premier paramètre nécessite pointeur sur NODE *

EDIT: Après avoir vérifié votre code après le contrôle, il ressemble à la fois 1er et 2ème du les paramètres passant à _search ne sont pas corrects. La méthode nécessite un pointeur vers le pointeur vers NODE. Par conséquent, la façon correcte de passer le paramètre est:

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