#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— после удаления элемента