我的代码有一点小问题。事实上,我不能理解为什么当在列表中插入时,最后一个要插入的元素是在整个列表中,这根据我的算法是不可能的。所以我创建了04个类:学生,笔记,类,问题。我在我的文件data.h matters_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 ;
}
您将意识到这些项目并不像预期的那样在列表中。事实上,列表的顶部在列表中的任何地方。是什么给了我建议,因为我还没有找到这个问题的任何解决方案
发布于 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也有一个功能完善的链接列表类。
https://stackoverflow.com/questions/50717126
复制相似问题