У меня небольшая проблема с моим кодом. На самом деле, я не могу понять, почему при вставке в список в уме последний элемент, который нужно вставить, находится во всем списке, что невозможно по моему алгоритму. Итак, я создал 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 ;
}
вы поймете, что элементы отсутствуют в списке, как ожидалось. Фактически, верхняя часть списка находится везде в списке. Что мне посоветовали так как я не нашел решения этой проблемы





Это потому, что ваши массивы, например 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 также имеет отлично функциональный класс списка ссылок.
В стандарте используются следующие термины: блок с ограниченным объемом или автоматический для массивов (стек - это всего лишь деталь реализации) и указатели на переменные, срок службы которых истек, и указанное болтающийся.
@SergeBallesta Спасибо, это полезные термины, чтобы получить более подробную информацию.
как избежать тогда этого "опасного" метода Я хочу, чтобы каждый узел с разными значениями мог быть в моем списке
Это полностью зависит от того, как вы собираетесь вводить данные студента. Традиционно вы создаете записи по одной по мере их заполнения, и тогда становится ясно, что вам нужно использовать new для их размещения.
Это техническая придирка, но "они становятся недействительными и опасными для использования" они не опасны в использовании ... Указатель с недопустимым значением практически не может использоваться ни для чего, кроме сброса его значения на допустимое. Технически вы можете прочитать его значение или установить другое недопустимое значение, но я не думаю, что это может быть когда-либо практичным, по крайней мере, не из моей головы. Операция сохраняет действительное значение в i->students, но оно становится недействительным, когда insert_ заканчивается, как вы сказали.
Невозможно, даже используя вектор или таблицу, это одно и то же. Мне скучно . Хорошо, я пришлю тебе еще одно предложение, чтобы посмотреть, сработает ли оно
Опасно использовать то, что адрес, на который указывают ученики, находится в стеке в середине следующей вызываемой функции. Выполните 2 вызова функции глубоко, а затем измените значение содержимого, на которое указывает ученик, и вы измените какое-либо значение стека в первой функции - это может быть что угодно, указанное на адрес - возможно, какая-то другая переменная данных, возможно, управление вызовом какой-либо функции данные. (Это описание очень приблизительное, так как функции используют разные объемы локальных данных.)
Что вы можете мне посоветовать, короче, как мне сделать, чтобы каждая нода была в моем списке. твои старые слова сбивают меня с толку. Все пробую, если нет возможности то подскажите
Есть ли какая-то конкретная причина, по которой вы пытаетесь реализовать список самостоятельно? Это не умно (кроме академических целей) и не так-то просто.