簡體   English   中英

從鏈接列表中刪除項目C ++

[英]remove an item from a linked list c++

我的物品清除功能有問題

void removeKey(int key) {
     ListElement *element = getElement(key);
         if (element != nullptr) {
             ListElement *nextElement = element->getNext();
             ListElement *previousElement = getPreviousElemnt(element);
             if (previousElement == nullptr) {//pierwszy element
                 firstElement = nextElement;
             } else if (nextElement == nullptr) { //
                   previousElement->setNext(nullptr);
             } else {
                   previousElement->setNext(nextElement);
             }
             delete element;
             size--;
         }
     }
}

 ListElement *getPreviousElemnt(ListElement *element) {
        ListElement *element1 = firstElement;
        if (element1 != nullptr) {
            while (element1->getNext() == element) {
                return element1;
            }
        }
        return nullptr;
    }

刪除第一個元素效果很好。 當我想從中心或末端刪除元素時,程序會刪除其左側的所有元素...

您需要修復代碼的getPreviousElement 現在,它執行的操作是檢查第一個元素是否在必需元素之前。 如果是,則正確返回。 如果否,則退出while循環並返回nullptr。 您需要繼續循環直到獲得元素。 我不會發布解決方案,因為它應該是您的學習練習。

您的getPreviousElemnt()無法正確循環。 它看起來應該更像這樣:

ListElement *getPreviousElemnt(ListElement *element) {
    ListElement *element1 = firstElement;
    while (element1 != nullptr) {
        ListElement *nextElement = element1->getNext();
        if (nextElement == element) {
            return element1;
        }
        element1 = nextElement;
    }
    return nullptr;
}

而且您的removeKey()不需要那么多的if..elseif..else塊,可以將其簡化為:

void removeKey(int key) {
    ListElement *element = getElement(key);
    if (element != nullptr) {
        ListElement *nextElement = element->getNext();
        ListElement *previousElement = getPreviousElemnt(element);
        if (previousElement != nullptr) {
            previousElement->setNext(nextElement);
        }
        if (firstElement == element) {
            firstElement = nextElement;
        }
        delete element;
        size--;
    }
}

但是,如果根本不使用getElement() ,則可以進一步極大地優化removeKey() ,因此避免了兩次遍歷列表的麻煩:

void removeKey(int key) {
    ListElement *element = firstElement;
    ListElement *previousElement = nullptr;
    while (element != nullptr) {
        if (element->getKey() == key) {
            ListElement *nextElement = element->getNext();
            if (previousElement != nullptr) {
                previousElement->setNext(nextElement);
            }
            if (firstElement == element) {
                firstElement = nextElement;
            }
            delete element;
            size--;
            return;
        }
        previousElement = element;
        element = nextElement;
    }
}

或者,更新getElement()以有選擇地返回上一個元素:

ListElement* getElement(int key, ListElement** previousElement = nullptr) {
    if (previousElement) {
        *previousElement = nullptr;
    }
    ListElement *element = firstElement;
    ListElement *previousElement1 = nullptr;
    while (element != nullptr) {
        if (element->getKey() == key) {
            if (previousElement) {
                *previousElement = previousElement1;
            }
            return element;
        }
        previousElement1 = element;
        element = element->getNext();
    }
    return nullptr;
}

void removeKey(int key) {
    ListElement* previousElement;
    ListElement *element = getElement(key, &previousElement);
    if (element != nullptr) {
        ListElement *nextElement = element->getNext();
        if (previousElement != nullptr) {
            previousElement->setNext(nextElement);
        }
        if (firstElement == element) {
            firstElement = nextElement;
        }
        delete element;
        size--;
    }
}
ListElement *getPreviousElemnt(ListElement *element) {
        ListElement *element1 = firstElement;
        if (element1 != nullptr) {
            while (element1->getNext() != element) {  //<----change this
                element1 = element1->getNext();
            }
             return element1; //<-----return previous
        }
        return nullptr;
    }

暫無
暫無

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

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