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

Is this code safe? (linked list, C++)

本文关键字:链表 C++ 代码 安全      更新时间:2023-10-16

以下代码似乎可以正常工作,可以从链表中删除节点:

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++中有一个列表实现,但我只是想在这里理解这个算法,而不是用其他东西替换它(。

即使代码在删除放置在列表开头、中间或结尾的节点时有效并且我没有看到任何错误,但我仍然对以下行有一些疑问:if (temp->next->data == toBeRemoved) .

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

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

不,那条线不安全。

temp->next 为 null 指针或temp->next->data包含要删除的值时,while循环结束。如果它因第一个原因而结束,则访问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;
        }
    }