2016-03-06 30 views
-4

下面我有一些基本的代码,我正在学习链接列表。这个函数传递一个数组并从中创建一个链表。但是,当我尝试编译它时,我得到一个关于非指针类型的错误。谁能告诉我我做错了什么?由于编译错误,链接列表:错误:' - >'的基本操作数有非指针类型'IntNodeType'

struct IntNodeType { 
    int value; 
    IntNodeType * next; 

    IntNodeType (int v=0, IntNodeType * p=NULL):value(v),next(p) 
    { 

    } 
}; 
IntNodeType * InitList (int a[], int size) 
{ 
     IntNodeType *p; 

     p = new IntNodeType[size]; 
     int i = 0; 

     while (i < size) 
     { 
       p[i]->value = a[i]; 

       if (i == size - 1) 
       { 
         p[i] -> next = NULL; 
         break; 
       } 
       else 
         p[i] -> next = p[i+1]; 

       i++; 
     } 

     return p; 

} 

回答

0

要正确编译代码,InitList的身体应该是:

// .. 
    IntNodeType *p; 

    p = new IntNodeType[size]; 
    int i = 0; 

    while (i < size) 
    { 
      p[i].value = a[i]; // here 

      if (i == size - 1) 
      { 
        p[i].next = nullptr; // here + nullptr 
        break; 
      } 
      else 
        p[i].next = &(p[i+1]); //here 

      i++; 
    } 

    return p; 

通知的期限运营商,而不是运营商->的使用。

尽管p是一个数组类型(可以被腐蚀成一个指针),它的内容不是指针。 p包含size许多IntNodeType s。 对于最后提到的线,你需要一个参考传递到非指针p[i+1]

这也是值得注意的,你应该在NULL使用nullptr

+0

非常感谢你的清晰和深思熟虑的答案。我只是想知道应该在什么条件下使用nullptr over null? –

+0

@ chynna-hernandez总之,总是。 'nullptr'是标准,'NULL'只会导致问题。如果这有助于您,请将此标记为解决方案,谢谢! –

+0

我试图标记它,显然有一个时间限制,以便您可以标记解决方案,但我想让你知道我确实很感谢你的帮助! –