首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在c++中创建包含指针的项的链接列表

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

Stack Overflow用户
提问于 2018-06-06 17:42:01
回答 1查看 1.3K关注 0票数 -1

我的代码有一点小问题。事实上,我不能理解为什么当在列表中插入时,最后一个要插入的元素是在整个列表中,这根据我的算法是不可能的。所以我创建了04个类:学生,笔记,类,问题。我在我的文件data.h matters_notes和node中创建了两个结构:

代码语言:javascript
复制
class STUDENTS ;
class CLASSES ;

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

};

node insert_();

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

代码语言:javascript
复制
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_:

代码语言:javascript
复制
int main()
{
  node x = insert_() ;
  //Assuming the class has a property called name 
  cout<<x.next->students_->name ;
  return 0 ;

}

您将意识到这些项目并不像预期的那样在列表中。事实上,列表的顶部在列表中的任何地方。是什么给了我建议,因为我还没有找到这个问题的任何解决方案

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 18:10:52

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

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

问题归根结底是所有权问题。您可以说STUDENTS* s = new STUDENTS[5],对c也是如此

但是,您必须考虑“谁会删除我分配的内存?”

因此,更好的方法是链表的每个节点在创建时应该只分配它自己的学生和类对象,当它自己被销毁时应该删除它。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50717126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档