Создать связанный список элементов, содержащих указатели в C++

У меня небольшая проблема с моим кодом. На самом деле, я не могу понять, почему при вставке в список в уме последний элемент, который нужно вставить, находится во всем списке, что невозможно по моему алгоритму. Итак, я создал 4 класса: СТУДЕНТЫ, ЗАМЕТКИ, КЛАССЫ, ВОПРОСЫ. И я создал две структуры в моем файле 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 ;

}

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

Есть ли какая-то конкретная причина, по которой вы пытаетесь реализовать список самостоятельно? Это не умно (кроме академических целей) и не так-то просто.

luk32 06.06.2018 13:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 219
1

Ответы 1

Это потому, что ваши массивы, например STUDENTS s[5] ;, объявлены в стеке. Когда вы отказываетесь от метода insert_, они становятся недействительными и опасными для использования.

Вам нужно использовать new для их распределения, но ваш подход к созданию 5 записей СТУДЕНТОВ в массиве не имеет для меня особого смысла.

Вопрос сводится к собственности. Можно сказать STUDENTS* s = new STUDENTS[5], и то же самое для c.

Но тогда вы должны подумать "кто удалит эту память, которую я выделил?"

Таким образом, лучший подход состоит в том, что каждый узел списка ссылок должен выделять только свой собственный объект СТУДЕНТ и КЛАСС при его создании и удалять его, когда он сам уничтожается.

Вам будет приятно узнать, что в C++ 11 есть инструмент, который поможет вам сделать именно то, что std::unique_ptr<STUDENT> - это указатель на студента, который автоматически удаляется при уничтожении указателя. В C++ 14 есть еще лучший инструмент std::make_unique<STUDENT>(), который создает экземпляр STUDENT, который вы назначаете указателю.

С другой стороны, C++ stl также имеет отлично функциональный класс списка ссылок.

В стандарте используются следующие термины: блок с ограниченным объемом или автоматический для массивов (стек - это всего лишь деталь реализации) и указатели на переменные, срок службы которых истек, и указанное болтающийся.

Serge Ballesta 06.06.2018 12:15

@SergeBallesta Спасибо, это полезные термины, чтобы получить более подробную информацию.

Gem Taylor 06.06.2018 12:21

как избежать тогда этого "опасного" метода Я хочу, чтобы каждый узел с разными значениями мог быть в моем списке

Esaïe Njongssi 06.06.2018 12:58

Это полностью зависит от того, как вы собираетесь вводить данные студента. Традиционно вы создаете записи по одной по мере их заполнения, и тогда становится ясно, что вам нужно использовать new для их размещения.

Gem Taylor 06.06.2018 13:09

Это техническая придирка, но "они становятся недействительными и опасными для использования" они не опасны в использовании ... Указатель с недопустимым значением практически не может использоваться ни для чего, кроме сброса его значения на допустимое. Технически вы можете прочитать его значение или установить другое недопустимое значение, но я не думаю, что это может быть когда-либо практичным, по крайней мере, не из моей головы. Операция сохраняет действительное значение в i->students, но оно становится недействительным, когда insert_ заканчивается, как вы сказали.

luk32 06.06.2018 13:43

Невозможно, даже используя вектор или таблицу, это одно и то же. Мне скучно . Хорошо, я пришлю тебе еще одно предложение, чтобы посмотреть, сработает ли оно

Esaïe Njongssi 06.06.2018 15:14

Опасно использовать то, что адрес, на который указывают ученики, находится в стеке в середине следующей вызываемой функции. Выполните 2 вызова функции глубоко, а затем измените значение содержимого, на которое указывает ученик, и вы измените какое-либо значение стека в первой функции - это может быть что угодно, указанное на адрес - возможно, какая-то другая переменная данных, возможно, управление вызовом какой-либо функции данные. (Это описание очень приблизительное, так как функции используют разные объемы локальных данных.)

Gem Taylor 06.06.2018 15:49

Что вы можете мне посоветовать, короче, как мне сделать, чтобы каждая нода была в моем списке. твои старые слова сбивают меня с толку. Все пробую, если нет возможности то подскажите

Esaïe Njongssi 07.06.2018 01:49

Другие вопросы по теме