从链接列表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;
}
移除第一个元素效果良好。当我想从中心或结尾删除一个元素时,程序会删除它左边的所有元素…
您的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--;
}
}
您需要修复代码的getPreviousElement
。现在它所做的是检查第一个元素是否是所需元素的前一个。如果是,则返回正确。如果否,则退出while循环并返回nullptr。您需要继续循环,直到获得元素为止。我不会发布解决方案,因为它应该是你的一个学习练习。
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;
}
相关文章:
- 运行同一解决方案的另一个项目的项目
- 从链接列表c++中删除一个项目
- 仅从无序集合中删除一个项目
- 是否可以将 EXE 文件作为 lib 文件链接到另一个项目?
- 如何使用另一个项目命名空间?
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 数组中无法解释的最后一个项目
- 单元测试类无法在我要测试的同一解决方案中的另一个项目中找到类
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 如果我尝试将对话框从一个项目移动到另一个项目,我是否需要从 rc 文件中复制 DESIGNINFO、对话框信息和AFX_
- OpenCV:文件存储操作员">>"在一个项目中工作,但不在另一个项目中工作(在同一类上)
- 如何将另一个项目中用 C 编写的源代码包含在我自己的项目中,C++在 Visual Studio 中
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- 将过滤器中的所有.cpp和.h移动到另一个项目并更正其文件夹位置
- 在另一个项目中包括继承的类时,抽象类的链接器错误
- 创建在另一个项目中定义的类对象
- 我正在尝试在Eclipse中构建一个C 项目,但是即使在使用MINGW路径设置路径变量之后,也会获得构建错误
- 在包含相同项目的向量中删除一个项目
- 将多个原型文件包含在一个项目中会导致protobuf_AssignDescriptorsOnce()已经有一个主体