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

C++ 创建包含c+中指针的项目链接列表+;,c++,pointers,linked-list,singly-linked-list,dangling-pointer,C++,Pointers,Linked List,Singly Linked List,Dangling Pointer,我的代码有点问题。 事实上,我不明白为什么在脑海中插入列表时,要插入的最后一个元素是在整个列表中,根据我的算法,这是不可能的。 所以我创建了04个课程:学生、笔记、课程、事项。 我在文件data.h\u notes和node中创建了两个结构: class STUDENTS ; class CLASSES ; struct node { STUDENTS *students__ ; CLASSES *classes__ ; node *next ; }; node i

我的代码有点问题。 事实上,我不明白为什么在脑海中插入列表时,要插入的最后一个元素是在整个列表中,根据我的算法,这是不可能的。 所以我创建了04个课程:学生、笔记、课程、事项。 我在文件data.h\u notes和node中创建了两个结构:

class STUDENTS ;
class CLASSES ;

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

};

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

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\ux:

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

}
intmain()
{
节点x=插入_u3;();
//假设类有一个名为name的属性
coutname;
返回0;
}
您将意识到,这些项目不在列表中。 事实上,排行榜的第一位在榜单的任何地方。
什么建议我,因为我没有找到任何解决这个问题的方法,那是因为你的数组,例如学生s[5]在堆栈上声明。当您离开
insert\方法时,它们将变得无效,使用起来很危险

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

这个问题归结为所有权问题。你可以说
STUDENTS*s=newstudents[5]
,对于
c

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

因此,更好的方法是,链接列表的每个节点在创建时只分配自己的学生和类对象,并在销毁时将其删除

您会很高兴知道,c++11有一个工具可以帮助您准确地执行以下操作:
std::unique_ptr
是指向学生的指针,当指针被销毁时,该指针会自动删除。c++14有一个更好的工具
std::make_unique()
生成分配给指针的学生实例


<> P.>另一方面,C++ STL也有一个完美的函数链表类。

标准中使用的术语是数组的范围或自动的(数组只是一个实现细节)和指向已经到达其生命终点并表示悬空的变量的指针。它们是有用的术语,可以查找更多细节。如何避免这种方法的“危险”,我希望每个节点的值不同​​可以在我的列表中,这完全取决于您打算如何填写学生详细信息。传统上,您在填写记录时一次创建一个记录,然后很明显您需要使用new来分配它们。这是一个技术上的挑剔,但“它们变得无效,使用起来很危险”,使用起来并不危险。。。具有无效值的指针实际上只能用于将其值重置为有效值。从技术上讲,你可以读取它的值,或者设置为另一个无效值,但我认为它永远都不实用,至少从我的头脑里是不可能的。op所做的是在
i->students
中存储一个有效值,但正如您所说,当
insert\uu
结束时,它会变得无效。您尝试自己实现列表有什么特别的原因吗?这不是一件聪明的事(除了学术目的),也不是那么容易。