簡體   English   中英

雙鏈表 - 節點刪除

[英]Double Linked List - Node Deletion

編寫程序以使用雙鏈表。 它的類完美地工作,一切都正確存儲,節點正在被添加,顯示和搜索。 問題是刪除。 類和deleteNode方法的代碼如下,對於我的生活,我似乎無法弄清楚為什么它沒有刪除正確的節點。

例如,假設我在鏈接列表的末尾插入一個數據“Morgan Captain 666-666-6666”的節點,當我顯示它和所有內容時,一切都會出現。 我對這些方法沒有任何問題。 但是當我嘗試刪除編號為“666-666-6666”的節點時,我出現了“數字不存在”消息。

我已經繪制了我的鏈表圖表,對我來說這是有道理的,但在代碼中顯然不是這樣。 有什么指針嗎?

編輯:我已經在列表的末尾有一個案例可以工作,但是沒有為列表的開頭和中間條目做任何事情。 頭節點也被作為所有不必要函數的參數取出。 更新后的代碼如下。

編輯2:似乎最后一種情況對從讀入函數添加到內存的節點不起作用。 更新。

類和結構:

struct node{
    node* next;
    node* prev;
    string lastname;
    string firstname;
    string phnum;
};

class linkedList
{
    node* n;        // indicator of current node
    node* head;     // head node, does change as needed
public:
    linkedList();
    ~linkedList();
    void choice(char choice);
    void makeList(node* &head);
    void addNode();
    void deleteNode();
    void searchName();
    void searchNum();
    void displayList();
    void writeFile();
};

deleteNode方法:

    void linkedList::deleteNode()
{
    string num;
    node *p, *f;    // To link any nodes back together after deletion.
    n = head;

    // Displays list of nodes to reference.  Function deletes based on phone number string comparison.
    displayList();
    cout << "Please enter the phone number from the list above, as displayed, that you would like to delete:  ";
    cin >> num;

    while (n != NULL)
    {
        // If a number matches
        if (n->phnum == num)
        {
            // If it's the head node - DOES NOT WORK
            if (n == head)
            {
                head = head->next;
                head->prev = NULL;
                delete n;

                cout << "This name and number has been deleted." << endl << endl;
                return;
            }
            // if it's a middle node - DOES NOT WORK
            else if (n->next != NULL)
            {
                p = n->prev;
                f = n->next;
                p->next = f;
                f->prev = p;
                delete n;

                cout << "This name and number has been deleted." << endl << endl;
                return;
            }
            // If it's an end node - WORKS FOR ADDED NODES, NOT DEFAULT ONES
            else
            {
                n->prev->next = NULL;
                delete n;

                cout << "This name and number has been deleted." << endl << endl;
                return;
            }
        }
        //If there is no matching number
        else
            n = n->next;
    }

    cout << "This number does not exist in our system." << endl << endl;

    return;
}

您只處理了正確刪除“中間”元素的一般情況。 您必須考慮要刪除第一個或最后一個元素的情況,確定識別這些情況的“if”條件,並使用不同的刪除代碼來適應。 一個提示是,正如你所做的那樣,將* head傳遞給刪除例程將不會在所有情況下都有效。 我不會更明確,所以你可以繼續學習。

暫無
暫無

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

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