LinkedList removePosition 删除错误的元素

LinkedList RemovePosition Removing the Wrong Element

本文关键字:元素 错误 删除 removePosition LinkedList      更新时间:2023-10-16

我正在创建一个模板化的链接列表,并使用它来模拟经过站点的火车。LinkedList的每个元素都是具有numberOfStops变量的TrainCar类的对象。如果此值在停止处等于 1,则LinkedList应该从列表中删除该元素。但是,它最终会删除它之前的元素。

我尝试修改RemovePosition函数和我通过此函数传递的值,但似乎没有什么能解决问题

这是我在LinkedList课上的RemovePosition()函数

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。使用这些相同的输入,到达停靠点 #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()函数的调用,因为当我在main()函数中将 if 条件设置为if(numberOfStops == 2)时,此解决方案有效。这是我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--;
}

我不明白为什么这会导致错误...

替换你的循环:

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

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

它应该可以解决问题