簡體   English   中英

C ++從鏈接列表中刪除節點

[英]C++ Deleting Node from Linked List

我試圖從分配的鏈接列表中刪除節點,遇到一個錯誤,我不知道如何解決。

這是我班

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是我創建的一個電話列表對象,三個名稱在列表中,是的,第四個是第三個的重復。 我需要證明錯誤消息能夠正確觸發。

我已經調試,並且第一個delete函數調用正確進行,但是下一次firstPtr和walker對象將名稱成員顯示為“讀取字符串的錯誤時出錯”。 我嘗試了多種方法來解決此問題,並且這種情況一直在發生。 感謝您的任何幫助。

在任何鏈表遍歷中,您都需要測試處理以下情況:

  1. 從空列表中添加/刪除(頭指針為空)
  2. 在列表的前面添加/刪除(頭指針需要更新)
  3. 從列表中間添加/刪除的一般情況
  4. 最后添加/刪除的特殊情況
  5. 找不到搜索的項目。

我不確定您的刪除功能是否正在處理上述情況2。 否則,當刪除列表的firstPtr時,我希望看到代碼更新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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM