-1

我的代码有一点问题。实际上,我无法理解为什么在考虑插入列表时,要插入的最后一个元素在整个列表中,根据我的算法这是不可能的。所以我创建了 04 个课程:学生、笔记、课程、事项。我在我的文件 data.h things_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 ;

}

您会意识到这些项目不在预期的列表中。事实上,列表的顶部无处不在。什么建议我,因为我还没有找到任何解决这个问题的方法

4

1 回答 1

1

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

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

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

但接下来,你得想想“谁会删除我分配的这块内存?

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

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

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

于 2018-06-06T10:10:51.873 回答