Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.
Закрыт 1 год назад.
Не могу сделать нормальную функцию по замене элементов в односвязном списке. Функция swap_val неправильно работает. Если свапать 2 рядом стоящих элемента программа просто крашится.
И кстати если брать 0-ой и например 3-ий элемент, то прога тоже некоректно работает. Помогите пожалуйста, не могу понять.
Вот код программы: https://pastebin.com/CKPXRGSC
При обмене двух элементов, которые рядом, нужно делать по-другому. Далее учитывать нужно если элемент первый в списке, то у него предыдущего нет. При смене первого элементы нужно не забыть поменять переменную head в классе.
template<typename T>
void List<T>::swap_val(int ind_1, int ind_2){
Node<T> *p1, *prev_p1, *p2, *prev_p2, *tmp_pos;
Node<T> *current = this->head;
if(ind_1){
prev_p2 = head;
for(int i = 1; i < ind_1; i++)
prev_p2 = prev_p2->pNext;
p2 = prev_p2->pNext;}
else{
// если индекс равен нулю, то предыдущий указатель 0
prev_p2=0;p2=head;}
if(ind_2){
prev_p1 = head;
for(int i = 1; i < ind_2; i++)
prev_p1 = prev_p1->pNext;
p1 = prev_p1->pNext;}
else{
// если индекс равен нулю, то предыдущий указатель 0
prev_p1=0;p1=head;}
if(p2->pNext == p1){
// если элементы находятся рядом, то обмен делаем по-другому
p2->pNext = p1->pNext;
p1->pNext=p2;
// проверяем, есть-ли предыдущий
if(prev_p2)prev_p2->pNext=p1;}
else
if(p1->pNext == p2){
// если элементы находятся рядом, то обмен делаем по-другому
p1->pNext = p2->pNext;
p2->pNext =p1;
// проверяем, есть-ли предыдущий
if(prev_p1)prev_p1->pNext=p2;}
else{
// стандартный обмен
tmp_pos = p1->pNext;
p1->pNext = p2->pNext;
p2->pNext = tmp_pos;
// проверяем, есть-ли предыдущий
if(prev_p1) prev_p1->pNext = p2;
if(prev_p2) prev_p2->pNext = p1; }
// если индекс был в начале, то меняем начало в классе
if(ind_1 == 0)head = p1;
if(ind_2 == 0)head = p2;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть таблица wxPropertyGrid с различными полями (wxStringProperty, wxUIntProperty, wxBoolProperty и тд