在c ++中创建包含指针的项目的链接列表

时间:2018-06-06 09:42:01

标签: c++ pointers linked-list singly-linked-list dangling-pointer

我的代码有点问题。 实际上,我无法理解为什么在列表中插入时,插入的最后一个元素是在整个列表中根据我的算法是不可能的。 所以我创建了04个课程:学生,笔记,课程,事项。 我在我的文件data.h contents_notes和node:

中创建了两个结构
class STUDENTS ;
class CLASSES ;

struct node
{
    STUDENTS *students__ ;
    CLASSES *classes__ ;
    node *next ;

};

node insert_();

在我的data.c文件中,我创建了insert_()函数:

node insert_()
{
   node *t = new node() ;
   t = NULL ;
   int i = 0 ;

   STUDENTS s[5] ;
   CLASSES c[5] ;

   for (i ; i != 5 ; i++)
   {
     node *i = new node() ;
     i->students__ = &s[i] ;
     i->classes__ = &c[i] ;
     i->next = t ;
     t = i ;
   }

   return *t ;
}

在main.c文件中,我调用了函数insert_:

int main()
{
  node x = insert_() ;
  //Assuming the class has a property called name 
  cout<<x.next->students_->name ;
  return 0 ;

}

你会发现这些项目不在预期的列表中。 事实上,列表的顶部是列表中的任何位置。 是什么告诉我,因为我没有找到任何解决这个问题的方法

1 个答案:

答案 0 :(得分:1)

这是因为您的数组,例如STUDENTS s[5] ;在堆栈中声明。当您离开insert_方法时,它们将变得无效且使用起来很危险。

您需要使用new来分配它们,但是您在数组中创建5个STUDENTS记录的方法对我来说并没有多大意义。

问题归结为所有权。您可以说STUDENTS* s = new STUDENTS[5]c

也一样

但是,你必须考虑&#34; 谁将删除我分配的内存?&#34;

因此,更好的方法是链接列表的每个节点在创建时应该只分配自己的STUDENT和CLASS对象,并且在自身被销毁时应该删除它。

你会很高兴地知道,c ++ 11有一个工具可以帮助你做到这一点std::unique_ptr<STUDENT>是指向学生的指针,当指针被销​​毁时会自动删除。 c ++ 14有一个更好的工具std::make_unique<STUDENT>()使你分配给指针的STUDENT实例。

另一方面,c ++ stl也有一个功能完善的链接列表类。