首页 文章

C从链接列表中删除节点

提问于
浏览
1

我试图从作业中的链接列表中删除节点,并遇到错误我不知道如何解决 .

这是我的 class

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是我创建的一个Phonelist对象,三个名字在List中,是的,第四个是第三个的dupe . 我需要显示错误消息正确触发 .

我已经调试了,第一个删除函数调用正确,但下次firstPtr和walker对象显示名称成员为“读取字符串字符的错误 . ” . 我已经尝试了多种方法来解决这个问题并且这种情况不断发生 . 感谢您的任何帮助 .

1 回答

  • 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;
        }
    }
    

相关问题