Указатели и рекурсия - PullRequest
0 голосов
/ 23 апреля 2009

Я использую рекурсивную функцию в списке (с файлом 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 в памяти, поэтому сигнатура функции должна использовать **.

Я знаю, что должен изменить способ, которым я это называю, но как?

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 ]

2 голосов
/ 23 апреля 2009
_search ((*pPre)->link ,(*pLoc)->link, key);

Первый параметр - это указателя типа на NODE, тогда как он должен быть указателем на указатель на NODE.

0 голосов
/ 23 апреля 2009
_search ((*pPre)->link ,(*pLoc)->link, key);

изменить выше:

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

Для первого параметра требуется указатель на NODE *

EDIT : После проверки вашего кода после РЕДАКТИРОВАНИЯ похоже, что как 1-й, так и 2-й параметры передают _search неправильно Метод требует указатель на указатель на NODE. Следовательно, правильный способ передачи параметра:

_search (&(*pPre)->link , &(*pLoc)->link, key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...