создать связанный список элементов, содержащих указатели в C ++ - PullRequest
0 голосов
/ 06 июня 2018

У меня небольшая проблема с моим кодом.На самом деле, я не могу понять, почему при вставке в список последний элемент для вставки находится во всем списке, что невозможно по моему алгоритму.Итак, я создал 04 класса: СТУДЕНТЫ, ЗАМЕЧАНИЯ, КЛАССЫ, ВОПРОСЫ.И в моем файле data.h были созданы две структурыФайл main.c Я вызываю функцию insert_:

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

}

, вы поймете, что элементы находятся не в списке, как ожидалось.На самом деле, верхняя часть списка находится везде в списке.Что посоветовал мне, потому что я не нашел решения этой проблемы

1 Ответ

0 голосов
/ 06 июня 2018

Это потому, что ваши массивы, например 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 также есть совершенно функциональный класс списка ссылок.

...