【问题标题】:Pointers and recursion指针和递归
【发布时间】:2009-04-23 05:04:15
【问题描述】:

我通过修改搜索功能并添加打印功能在列表中使用递归函数(带有 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 ;
}

【问题讨论】:

    标签: c++ pointers recursion


    【解决方案1】:
    _search ((*pPre)->link ,(*pLoc)->link, key);
    

    第一个参数类型指向NODE的指针,而它应该是指向NODE的指针。

    【讨论】:

      【解决方案2】:
      _search ((*pPre)->link ,(*pLoc)->link, key);
      

      将上面的内容改为:

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

      它的第一个参数需要指向 NODE* 的指针

      编辑: 在编辑后检查您的代码后,看起来第一个和第二个传递给 _search 的参数都不正确。该方法需要指向 NODE 的指针。因此,正确的参数传递方式是:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 2014-05-10
        • 2018-05-01
        • 2017-10-13
        • 2012-03-09
        相关资源
        最近更新 更多