2014-10-06 132 views
0

所以我是新来的C++对不起,如果这不是清除。C++指针链表

我有一个类:

class Item 
{ 
    int noItem; 
    int qItem; 
public: 
    Item(int noItem, int qItem) 
    { 
      this->noItem = noItem; 
      this->qItem = qItem; 
    } 

    int getNoItem() 
    { 
      return noItem; 
    } 

    int getQntItem() 
    { 
      return qItem; 
    } 
}; 

然后下面的类:

class Element 
{ 
public: 
    Element() 
    { 
      data = NULL; 
    } 

    //to set and access data hold in node 
    void setElement(Item *data) 
    { 
      this->data = data; 
    } 
    Item* getElement(void) 
    { 
      return(data); 
    } 

private: 
    Item *data; 
}; 

这其中也:

class ListeChainee 
{ 
public: 

    ListeChainee() 
    { 
     courant = NULL; 
    } 
    void ajoutListe(Item *data) 
    { 
     Element *newData; 

     //set data 
     newData->setElement(data); 

     //check if list is empty 
     if(courant == NULL) 
     {   
      //set current pointer 
      courant = newData; 
     } 


    } 

    //get data from element pointed at by current pointer 
    Item* elementCourant(void) 
    { 
      if(courant != NULL) 
      { 
       return courant->getElement(); 
      } 
      else 
      { 
       return NULL; 
      } 
    } 

private: 
    //data members 
    Element *courant;   //pointer to current element in list 

}; 

代码缺少一些东西,其他的事情,但我的问题是这样的:

int main(int argc, char* argv[]) 
{ 
    ListeChainee listeCH; 
    Item i1(123,456); 

    listeCH.ajoutListe(&i1); 

    cout << listeCH.elementCourant()->getNoItem(); 

    system("pause"); 

    return 0; 
} 

我期待123被输出,但我看到一些其他的数字。不知道为什么。 谢谢。

+0

在链接列表中,您有一个节点结构或类,它通常包含一个指向列表中“下一个”节点的“下一个”指针,和/或可选地指向前一个指针节点。 “list”本身将包含一个指向列表中第一个和/或最后一个节点的指针。 – rcgldr 2014-10-06 00:41:35

+0

@imreal我在这里替换了真正的变量名,对不起应该选择了新的东西旁边的其他东西.. – Enriquev 2014-10-06 00:43:38

+0

@rcgldr是的,我确实拥有所有这些,为了清楚起见,我只是在这里删除了它们。 – Enriquev 2014-10-06 00:44:41

回答

2

您的Element *newData没有Element类的实例,所以当您尝试访问newData指向的实例时,它会崩溃。

尝试将Element *newData;更改为Element *newData = new Element;

  • ps .:不要忘记delete它当你不需要实例了。
+0

就是这样,我只是错过了它。谢谢! – Enriquev 2014-10-06 01:04:45

1

此方法写入未初始化的内存:

void ajoutListe(Item *data) 
{ 
    Element *new; 

    //set data 
    new->setElement(data); // Right here, "new" is an uninitialized pointer 

    //check if list is empty 
    if(courant == NULL) 
    {   
     //set current pointer 
     courant = new; 
    } 
} 

我很惊讶这个编译(不是吗?)。这段代码也应该崩溃。

你得到的奇怪数字肯定是一些随机的记忆部分。你可能想更多地考虑内存管理 - 这里有很多问题。当调用ajoutListe时,为什么courant成员只有在NULL时才被设置?我们只是泄漏新元素?我们如何实际遍历这个列表?

+0

谢谢你是对的,我需要它的一个实例。而关于NULL的事情,其实有一个else语句,我之前刚刚删除它,因为它并不是真的需要。我删除了所有列表操作等。我的代码更完整。我与一个实例合作,谢谢! – Enriquev 2014-10-06 01:01:59

+0

太棒了,很高兴它解决了。 – d3coy 2014-10-06 01:41:12