这段代码安全吗? (链表,C ++)

时间:2017-04-14 01:38:59

标签: c++ linked-list

以下代码似乎可以从链表中删除节点:

bool remove(node * & head, int toBeRemoved)
{
 if (head == nullptr)  //empty list
        return false;
    else {
        node * temp = head;

        //the first node needs to be removed
        if (head->data == toBeRemoved) { 
            head = head->next;
            delete temp;
            return true;
        }

        //seek for node and remove it
        else {
            while (temp->next != nullptr && temp->next->data != toBeRemoved)
                temp = temp->next;
            if (temp->next->data == toBeRemoved){
                node * removeThis = temp->next;
                temp->next = temp->next->next;
                delete removeThis;
                return true;
            }

            //data to be removed can't be found in the list
            else
                if (temp->next == nullptr && temp->next->data != toBeRemoved)
                    return false;
        }
    }
}

(我知道C ++中有一个列表实现,但我只是试图在这里理解这个算法,而不是用其他东西替换它。)

即使代码在删除位于列表开头,列表之间或末尾的节点并且我没有看到任何错误时仍然有效,我仍然对以下行感到疑惑:{{1 }}。

由于当要删除的节点是最后一个节点(即:if (temp->next->data == toBeRemoved))时,可以执行整个块,因此我想知道尝试访问temp->next==nullptr的安全性。< / p>

即使它是安全的,这是一个糟糕的编程习惯吗?

1 个答案:

答案 0 :(得分:3)

不,那条线不安全。

while为空指针或temp->next包含要删除的值时,temp->next->data循环结束。如果它因第一个原因而结束,那么访问temp->next->data是无效的,因为它通过空指针进行间接。

while循环结束后,您应该更改测试的顺序。首先检查空指针。如果它不是空指针,则表示您找到了该元素,您可以将其删除。

        while (temp->next != nullptr && temp->next->data != toBeRemoved) {
            temp = temp->next;
        }
        if (temp->next == nullptr) { // data couldn't be found
            return false;
        } else { // data was found, remove it
            node * removeThis = temp->next;
            temp->next = temp->next->next;
            delete removeThis;
            return true;
        }

    }