C++ 创建包含c+中指针的项目链接列表+;
我的代码有点问题。 事实上,我不明白为什么在脑海中插入列表时,要插入的最后一个元素是在整个列表中,根据我的算法,这是不可能的。 所以我创建了04个课程:学生、笔记、课程、事项。 我在文件data.h\u notes和node中创建了两个结构: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
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
结束时,它会变得无效。您尝试自己实现列表有什么特别的原因吗?这不是一件聪明的事(除了学术目的),也不是那么容易。