我所拥有的程序没有任何错误,但似乎我的代码也没有删除它的假设。 locateNode()
和Remove()
都会接收应该找到的内容然后删除。以下是我需要处理的两个功能。在remove函数中我应该使用locateNode()
函数,所以可能有两个函数的程序,但我觉得它就像是remove函数。 PushAvail()
中使用的Remove()
函数只接受一个下标参数,有点像删除(PushAvail()
100%正确)。
bool SortedList::locateNode(
ItemType anItem, int& previous, int& position) const
// IN OUT OUT
{
position = 1;
previous = 0;
int head = list[0].next;
int current = head;
while ((list[current].next != NONE) && (list[current].item < anItem))
{
if (list[current].item >= anItem)
{
if (list[current].item == anItem)
{
return true;
}
}
position++;
previous=current;
current=list[current].next;
}
return false;
}
void SortedList::Remove(ItemType anItem, bool& success)
// IN OUT
{
int head = list[0].next;
int current = head;
int previous = 0;
int position = 0;
success = locateNode(anItem, previous, position);
if (success)
{
list[previous].next = list[list[previous].next].next;
for (int i = 0; i < position; i++)
{
current = list[i].next;
}
PushAvail(current);
}
}
以下是一些错误的示例:
ERROR: Delete operation failed.
List Length = 17
ERROR: Delete operation failed.
List Length = 17
DisplayList( LLL ): should list 12 items
(10, 35, 50, 80, 101, ..., 108):
List item #1 is: 5
List item #2 is: 10
List item #3 is: 15
List item #4 is: 15
List item #5 is: 25
List item #6 is: 35
List item #7 is: 80
List item #8 is: 101
List item #9 is: 102
List item #10 is: 103
List item #11 is: 104
List item #12 is: 105
List item #13 is: 106
List item #14 is: 107
List item #15 is: 108
List item #16 is: 109
List item #17 is: 50
答案 0 :(得分:0)
您的第一个问题出在locateNode
函数中,条件是while
循环及其内部的第一个if
:
while ((list[current].next != NONE) && (list[current].item < anItem))
{
if (list[current].item >= anItem)
您看,条件list[current].item < anItem
和list[current].item >= anItem
是互斥的,且不能同时true
,因此您的while
机构实际上只能遍历该列表并且从不做任何其他事情,您的功能locateNode
总是返回false
。
纠正这种情况的一种方法是:
while (current != NONE) // NOTE: You probably had another bug here; when list was empty...
{
if (list[current].item > anItem)
break;
else if (list[current].item == anItem)
return true;
position++;
previous=current;
current=list[current].next;
}