2009-04-23 9 views
0

私は検索機能を変更し、印刷機能を追加することによって、(ADTファイルで)、リスト内の再帰関数を使用しています:ポインタと再帰

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

しかし、私は

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

でエラーが出ますエラー:

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

なぜわからないのですか? 私は追加して取り除いてみました*しかし、私はまだそれを正しく取得しません。

と私はそれを初期化する:

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

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

機能を

呼び出される前に、この関数はメモリ内にPPREとPLOCの位置を返すので、関数シグネチャが**を使用しなければなりません。

私はそれを呼び出す方法を変更する必要がありますが、どのように変更する必要がありますか?それはNODEへのポインタへのポインタでなければならないのに対し

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

答えて

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

最初のパラメータNODEに型ポインタのあります。 EDITの後にあなたのコードをチェックした後、それは第一と第二の両方のようになります。

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

は、これは、最初のパラメータは、*

EDIT NODEへのポインタが必要です。

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

変更上記に_searchに渡すパラメータが正しくありません。このメソッドは、NODEへのポインタへのポインタを必要とします。したがって、パラメータを渡す正しい方法は次のとおりです。

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