LinkedList RemovePosition Удаление неправильного элемента

#c #linked-list

#c #связанный список

Вопрос:

Я создаю шаблонный LinkedList и использую его для имитации поезда, проходящего через остановки. Каждый элемент LinkedList является объектом TrainCar класса с numberOfStops переменной. Если это значение равно 1 на остановке, LinkedList предполагается удалить этот элемент из списка. Однако в конечном итоге вместо этого удаляется элемент перед ним.

Я попытался изменить как RemovePosition функцию, так и значение, которое я передаю через эту функцию, и, похоже, ничто не решает проблему

Вот моя RemovePosition() функция в моем LinkedList классе

 template <class T>
void LinkedList<T>::RemovePosition(int index) {
  if(index == 0) {
    RemoveFromFront();
  }

  else if(index == (size - 1)) {
    RemoveFromEnd();
  }
  else {
    node<T>* temp1 = head;
    for(int i = 0; i < index - 1; i  ) {
      temp1 = temp1->next;
    }

    node<T>* temp2 = temp1->next;
    temp1->next = temp2->next;
    size--;
  }
}
  

Вот мой main() код функции, в котором возникает ошибка

 for(j = 1; j <= stops; j  ) {
    cout << "Stop #" << j << ":" << endl;
    cout << "Train Arriving: ";

    for(i = 0; i < train.size; i  ) {
      type = train.Retrieve(i).typeOfCar;
      id = train.Retrieve(i).finalID;
      numberOfStops = train.Retrieve(i).numberOfStops;
      cout << "[" << id << ":" << type << ":" << numberOfStops << "] ";
    }

    cout << endl << "Removing cars:" << endl;

    for(i = 0; i < train.size; i  ) {
      numberOfStops = train.Retrieve(i).numberOfStops;
      if(numberOfStops == 1) {
        id = train.Retrieve(i).finalID;
        type = train.Retrieve(i).typeOfCar;
        cout << "[" << id << ":" << type << "] removed" << endl;
        if(train.Retrieve(i).typeOfCar == 'P') {
          addCargoCar--;
        }
        train.RemovePosition(i);
      }
    }
}
  

Вот мой текущий результат

 Stop #1:
Train Arriving: [9:P:4] [5:P:2] [3:P:2] [10:C:2] [8:C:1] [1:C:2] [2:M:1] [4:M:5] [6:M:4] [7:M:1]
Removing cars:
[8:C] removed
[2:M] removed
[7:M] removed
Adding cars:
[11:P:2] added
[12:C:4] added
[13:P:4] added
[14:M:2] added
[15:M:2] added
Stop #2:
Train Arriving: [13:P:4] [11:P:2] [9:P:4] [5:P:2] [3:P:2] [12:C:4] [8:C:1] [2:M:1] [4:M:5] [7:M:1] [14:M:2] [15:M:2]
  

Как вы можете видеть, неправильные TrainCar s были удалены. С этими же входными данными правильный результат для поезда, прибывающего на остановку # 2, будет:

 Stop #1:
Train Arriving: [9:P:4] [5:P:2] [3:P:2] [10:C:2] [8:C:1] [1:C:2] [2:M:1] [4:M:5] [6:M:4] [7:M:1]
Removing cars:
[8:C] removed
[2:M] removed
[7:M] removed
Adding cars:
[11:P:2] added
[12:C:4] added
[13:P:4] added
[14:M:2] added
[15:M:2] added
Stop #2:
Train Arriving: [13:P:4] [11:P:2] [9:P:4] [5:P:2] [3:P:2] [12:C:4] [10:C:2] [1:C:2] [4:M:5] [6:M:4] [14:M:2] [15:M:2]
  

ПРАВКА1: реализуя решение, предоставленное @leJohn, я теперь получаю ошибку сегментации. Я считаю, что это должно быть сделано для моего вызова RemoveFromEnd() функции, поскольку это решение работает, когда я устанавливаю условие if if(numberOfStops == 2) в моей main() функции. Вот моя RemoveFromEnd() функция

 template <class T>
void LinkedList<T>::RemoveFromEnd() {
  node<T>* cur = head;
  node<T>* pre = cur;

  while(cur->next != NULL) {
    pre = cur;
    cur = cur->next;
  }

  pre->next = NULL;
  tail = pre;
  size--;
}
  

Я не понимаю, почему это вызывает ошибку…

Комментарии:

1. Хорошая возможность узнать, как использовать отладчик для пошагового выполнения кода построчно.

Ответ №1:

Замените свой цикл :

 for(int i = 0; i < index - 2; i  ) {
      temp1 = temp1->next;
    }
  

Автор:

 for(int i = 0; i < index - 1; i  ) {
      temp1 = temp1->next;
    }
  

Это должно сработать

Комментарии:

1. Используя это, я теперь получаю ошибку сегментации. Я считаю, что это связано с моим вызовом метода RemoveFromEnd(), поскольку этот цикл работает, когда я меняю свое условие if на if(numberOfStops == 2)

2. Я обновил свой вопрос, чтобы включить мою RemoveFromEnd() функцию. Я не понимаю, почему это может вызвать ошибку…

3. Я предполагаю, что ваши проблемы возникают из-за того, что вы удаляете элементы своего списка во время итерации по нему. Как правило, это плохая практика, поскольку вы аннулируете индекс и / или итераторы. Вы должны искать вокруг этого. Попробуйте i— после удаления элемента