我已经找到了关于如何定位和删除节点的问题

时间:2018-04-04 03:23:09

标签: c++ c++11 singly-linked-list

我所拥有的程序没有任何错误,但似乎我的代码也没有删除它的假设。 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

1 个答案:

答案 0 :(得分:0)

您的第一个问题出在locateNode函数中,条件是while循环及其内部的第一个if

while ((list[current].next != NONE) && (list[current].item < anItem))
{
    if (list[current].item >= anItem)

您看,条件list[current].item < anItemlist[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;
}