C++ 删除链表中的特定节点
我有一个这样的链表C++ 删除链表中的特定节点,c++,linked-list,C++,Linked List,我有一个这样的链表 struct product { string ID; double quantity; product* next = NULL; }; 我想删除所有数量小于一个数字的产品。 如果至少删除了一个产品,则此函数返回true,否则返回false。这是我的密码 bool deleteProducts(product*& pHead, double quantity) { static int flag = 0; product* pTemp = pHea
struct product {
string ID;
double quantity;
product* next = NULL;
};
我想删除所有数量小于一个数字的产品。
如果至少删除了一个产品,则此函数返回true,否则返回false。这是我的密码
bool deleteProducts(product*& pHead, double quantity) {
static int flag = 0;
product* pTemp = pHead;
product* prev = pHead;
if (pTemp != NULL && pTemp->quantity <= quantity) pHead = pTemp->next;
while (pTemp != NULL && pTemp->quantity > quantity) {
prev = pTemp;
pTemp = pTemp->next;
}
if (pTemp == NULL) return flag;
flag = 1;
prev->next = pTemp->next;
deleteProducts(prev->next, quantity);
}
我运行quantity=10的函数,它返回:
7.5 -> 5
这不是真的,有人能为我解释一下吗。提前谢谢 将起始状态短路列表设置到
pHead
,将本地prev
设置为pHead的地址。为什么不使用pHead->prev
或nullptr
从双链表中删除元素的操作是时间压缩O(n)操作。您必须遍历列表并折叠符合条件的记录。您的方法有几个问题
标志
。(请参阅其他注释,了解其不好的原因。)pPrev
#include <iostream>
#include <string>
using namespace std;
typedef struct product {
string ID;
double quantity;
product* next = NULL;
} product;
product* deleteProducts(product*& pHead, double quantity) {
product* pTemp = pHead;
product* pPrev = pHead;
while (pTemp != NULL) {
if ( pTemp->quantity > quantity ){
if ( pTemp == pHead ){
cout << "Deleteing Current Head " << pTemp->quantity << endl;
product* pTmp = pHead;
pTemp = pTemp->next;
pHead = pPrev = pTemp;
delete pTmp;
}
else{
cout << "Deleteing Node" << pTemp->quantity << endl;
product* pNext = pTemp->next;
delete pTemp;
pTemp = pNext;
pPrev->next = pTemp;
}
}
else{
pPrev = pTemp;
pTemp = pTemp->next;
}
}
return pHead;
}
bool printProducts(product*& pHead) {
product* pTemp = pHead;
while (pTemp != NULL) {
cout << pTemp->quantity << " ";
pTemp = pTemp->next;
}
cout << endl;
}
int main()
{
product* p1 = new product{"1", 7};
product* p2 = new product{"2", 7.5};
product* p3 = new product{"3", 2};
product* p4 = new product{"4", 5};
product* p5 = new product{"5", 6};
p1->next = p2;
p2->next = p3;
p3->next = p4;
p4->next = p5;
if ( deleteProducts(p1, 10) ){
cout << "Done" << endl;
}
printProducts(p1);
return 0;
}
#包括
#包括
使用名称空间std;
typedef结构产品{
字符串ID;
双倍数量;
product*next=NULL;
}产品;
产品*删除产品(产品*和pHead,双倍数量){
产品*pTemp=pHead;
产品*pPrev=pHead;
while(pTemp!=NULL){
如果(pTemp->数量>数量){
如果(pTemp==pHead){
下一步;
}
}
返回pHead;
}
布尔打印产品(产品*&pHead){
产品*pTemp=pHead;
while(pTemp!=NULL){
其次是数量;
}
cout-next=p2;
p2->next=p3;
p3->next=p4;
p4->next=p5;
如果(删除产品(p1,10)){
为什么flag
是静态的呢?一旦删除了一个节点,函数将始终返回true
@molbdnilo,因为每个递归循环之后,尽管有已删除的节点,但标记将为0。它的是静态的
,所以它只初始化一次,这是第一次调用函数。是什么让你在这里使用递归的呢?RemLList中的oving元素始终为O(n)。只需遍历列表并删除符合删除条件的元素。要调试它,请坐下来用一张纸和一支铅笔画出列表和所有指针。这是调试面向指针的算法和结构的最佳方法。
#include <iostream>
#include <string>
using namespace std;
typedef struct product {
string ID;
double quantity;
product* next = NULL;
} product;
product* deleteProducts(product*& pHead, double quantity) {
product* pTemp = pHead;
product* pPrev = pHead;
while (pTemp != NULL) {
if ( pTemp->quantity > quantity ){
if ( pTemp == pHead ){
cout << "Deleteing Current Head " << pTemp->quantity << endl;
product* pTmp = pHead;
pTemp = pTemp->next;
pHead = pPrev = pTemp;
delete pTmp;
}
else{
cout << "Deleteing Node" << pTemp->quantity << endl;
product* pNext = pTemp->next;
delete pTemp;
pTemp = pNext;
pPrev->next = pTemp;
}
}
else{
pPrev = pTemp;
pTemp = pTemp->next;
}
}
return pHead;
}
bool printProducts(product*& pHead) {
product* pTemp = pHead;
while (pTemp != NULL) {
cout << pTemp->quantity << " ";
pTemp = pTemp->next;
}
cout << endl;
}
int main()
{
product* p1 = new product{"1", 7};
product* p2 = new product{"2", 7.5};
product* p3 = new product{"3", 2};
product* p4 = new product{"4", 5};
product* p5 = new product{"5", 6};
p1->next = p2;
p2->next = p3;
p3->next = p4;
p4->next = p5;
if ( deleteProducts(p1, 10) ){
cout << "Done" << endl;
}
printProducts(p1);
return 0;
}