【问题标题】:C++ Deleting Node from Linked ListC++ 从链表中删除节点
【发布时间】:2019-05-10 22:21:36
【问题描述】:

我正在尝试从作业中的链表中删除节点,但遇到了一个我不知道如何解决的错误。

这是我的课

class PhoneList
{
public:
    PhoneList(string/*name*/);
    ~PhoneList();
    void showList(ostream&/*file/screen*/) const;
    friend void showList(ostream&/*file/screen*/, PhoneList/*List*/);
    void addDirectory(string/*name*/, int/*areaCode*/, int/*phoneNo*/);
    void removeDirectory(string/*name*/);
    int getNoDirectories()const { return noDirectories; }
    string getTitle()const { return title; }
private:
    Directory *firstPtr;
    string title;
    int noDirectories;
};

这是我的目录结构

struct Directory
{
    string name;
    int areaCode;
    int phoneNo;
    Directory *link;
};

这是我的删除功能

void PhoneList::removeDirectory(string delName)
{
    Directory *walker = NULL;
    Directory *stalker = NULL;
    Directory *placeHolder = NULL;

    walker = firstPtr;
    stalker = NULL;

    while (walker != NULL)
    {
        if (walker->name == delName)
        {
            break;
        }
        else
        {
            stalker = walker;
            walker = walker->link;
        }
    }

    if (walker == NULL)
    {
        cout << "Contact not found. Removal not possible. Please enter valid contact name." << endl;
    }
    else
    {
        stalker = walker;
        walker = walker->link;
        delete stalker;

        cout << "Contact Deleted." << endl;
    }
}

这是我正在使用的客户端代码

myBlackBook->removeDirectory("Adam Taurus");
myBlackBook->removeDirectory("Xander Rogan");
myBlackBook->removeDirectory("Johnathan Jones");
myBlackBook->removeDirectory("Johnathan Jones");

myBlackBook 是我创建的电话列表对象,三个名字都在列表中,是的,第四个是第三个的骗子。我需要证明错误消息正确触发。

我已经调试过,第一个删除函数调用正确通过,但下一次 firstPtr 和 walker 对象将名称成员显示为“读取字符串字符时出错。”。 我已经尝试了多种方法来解决这个问题,而且这种情况一直在发生。感谢您的帮助。

【问题讨论】:

    标签: c++ string linked-list


    【解决方案1】:

    在任何链表遍历中,都需要测试处理以下几种情况:

    1. 在空列表中添加/删除(头指针为空)
    2. 在列表前面添加/删除(头指针需要更新)
    3. 从列表中间添加/删除的一般情况
    4. 最后添加/删除的特殊情况
    5. 未找到搜索的项目。

    我不确定您的删除功能是否处理上述案例 #2。否则,当列表的头部被移除时,我希望看到代码更新 firstPtr

    void PhoneList::removeDirectory(const string& delName)
    {
        Directory *walker = firstPtr;
        Directory* previous = NULL;
        bool found = false;
    
        if (firstPtr)
        {
            while (walker && !found)
            {
                if (walker->name == delName)
                {
                    if (walker == firstPtr)
                    {
                        // handle the special case of deleting from the front
                        firstPtr = firstPtr->link;
                    }
                    else
                    {
                        previous->link = walker->link;
                    }
                    delete walker;
                    found = true;
                }
                else
                {
                    previous = walker;
                    walker = walker->link;
                }
            }
        }
    
        if (found)
        {
             cout << "Contact Deleted." << endl;
        }
        else
        {
             cout << "Contact not found." << endl;
        }
    }
    

    【讨论】:

    • bool 不是必需的,因为我第一次运行该函数时它工作正常。然而,即使在第二次运行时使 firstPtr = firstPtr->link firstPtr 具有“错误读取字符串字符”值。
    • 我怀疑如果您的删除功能缺少边缘情况,您的插入功能也可能会破坏列表。
    • "但是即使在第二次运行时使 firstPtr = firstPtr->link.." 那是因为 firstPtr 的内容已经已损坏,因为您在第一次运行时将其删除。
    • 添加了一个检查,确保开头的 firstPtr 不为 NULL,并使其仅在 walker = firstPtr 时才更改 firstPtr,如果不是,则将 stalker 链接更改为 walker 链接,并且它现在可以正常运行。谢谢你。你的帮助让我得到了这个。另外应该读到我第一次创建了 firstPtr = firstPtr->link 然后该函数第二次在我遇到问题的地方运行。很抱歉造成混乱
    猜你喜欢
    • 2017-10-21
    • 2013-08-30
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2019-05-10
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多