2009-04-23 5 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에 입력 포인터이다. 편집 후 코드를 확인한 후가 1, 2 차 모두 같습니다

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

그것은 첫 번째 매개 변수는 *

편집 노드에 대한 포인터가 필요합니다

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

변화 위에 _search에 전달되는 매개 변수가 올바르지 않습니다. 이 메소드에는 NODE를 가리키는 포인터가 필요합니다. 따라서 매개 변수를 전달하는 올바른 방법은 다음과 같습니다.

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