C++ swap элементов в односвязном списке [закрыт]

222
28 октября 2021, 07:50
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос

Не могу сделать нормальную функцию по замене элементов в односвязном списке. Функция swap_val неправильно работает. Если свапать 2 рядом стоящих элемента программа просто крашится.

И кстати если брать 0-ой и например 3-ий элемент, то прога тоже некоректно работает. Помогите пожалуйста, не могу понять.

Вот код программы: https://pastebin.com/CKPXRGSC

Answer 1

При обмене двух элементов, которые рядом, нужно делать по-другому. Далее учитывать нужно если элемент первый в списке, то у него предыдущего нет. При смене первого элементы нужно не забыть поменять переменную 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;
    }
READ ALSO
C++ ООП.Доступ к private

C++ ООП.Доступ к private

Есть ли возможность в C++ достать объект из private без наследования?

98
Потоки ввода/вывода С++

Потоки ввода/вывода С++

Есть вопрос по потокам ввода/вывода

84
GetFocus на wxStringProperty

GetFocus на wxStringProperty

Есть таблица wxPropertyGrid с различными полями (wxStringProperty, wxUIntProperty, wxBoolProperty и тд

191