[英]C++ Issue with deleting item from linked list
上一個問題解決了!
新問題:代碼本身。 我一直在研究 function 的代碼,以從鏈接列表中刪除選定的項目,它可能會出現多少次。 但是,當我運行該部分程序以嘗試刪除節點時,它只會結束程序。 我知道肯定會發生一些事情,但是即使查看有關此的教程,我也不太了解如何實現此指令。 任何幫助將不勝感激。 [解決]
Function
void LinkedList::deleteItem(int _newItem)
{
if(isEmptyList())
cout << "\t<ERROR> List is empty.\n";
else
{
bool itemDelete = false;
nodeType *q = first;
while(q != NULL)
{
if(first->info == _newItem)
{
nodeType *p = first->link;
first->link = p->link;
delete p;
--count;
itemDelete = true;
}
if(q->link->info == _newItem)
{
nodeType *r = q;
nodeType *p = q;
r = r->link;
p->link = r->link;
delete r;
--count;
itemDelete = true;
}
q = q->link;
}
if(itemDelete == true)
cout << "Item was deleted.";
else
cout << "Item was not found.";
}
}
Class 和結構
struct nodeType
{
int info;
nodeType *link;
};
class LinkedList
{
public:
void initializeList();
bool isEmptyList();
void printList();
int findLength();
void destroyList();
int infoFirst();
int infoLast();
bool searchItem(int);
void insertFront(int);
void insertBack(int);
void deleteItem(int);
int calcTotal();
int calcAvg();
LinkedList();
private:
nodeType *first, *last, *newNode;
int count; //adds or remove one whenever a node is added or removed
};
您的代碼的一個問題是這一行:
if(q->link->info == _newItem)
您正在訪問鏈接列表中的下一個鏈接,但下一個鏈接可能是 nullptr:
if(q->link != nullptr && q->link->info == _newItem)
在訪問其成員信息之前,您應該首先檢查它是否為 nullptr。
您還應該考慮搬家:
if(first->info == _newItem)
{
nodeType *p = first->link;
first->link = p->link;
delete p;
--count;
itemDelete = true;
}
在循環之外,因為您將在每次進入循環時通過此檢查 go 如果您嘗試刪除的節點不是第一個,因為您首先檢查節點,而不是您用來循環的節點 q你的鏈表。
另外請考慮使用 nullptr 代替 NULL。
else
{
bool itemDelete = false;
nodeType *q = first;
if(first->info == _newItem)
{
nodeType *p = first->link;
first->link = p->link;
delete p;
--count;
itemDelete = true;
}
// by doing !itemDelete you will exit once you find the item
// or you won't enter the loop if the item was the first in the list
while(q != nullptr && !itemDelete)
{
if(q->link != nullptr && q->link->info == _newItem)
{
nodeType *r = q;
nodeType *p = q;
r = r->link;
p->link = r->link;
delete r;
--count;
itemDelete = true;
}
q = q->link;
}
if(itemDelete == true)
cout << "Item was deleted.";
else
cout << "Item was not found.";
}
這部分可以進一步折疊:
// by doing !itemDelete you will exit once you find the item
while(q != nullptr && !itemDelete)
{
if(q->link != nullptr && q->link->info == _newItem)
{
nodeType *r = q;
nodeType *p = q;
r = r->link;
p->link = r->link;
delete r;
--count;
itemDelete = true;
}
q = q->link;
}
至:
// by doing !itemDelete you will exit once you find the item
while(q->link != nullptr && !itemDelete)
{
if(q->link->info == _newItem)
{
nodeType *r = q;
nodeType *p = q;
r = r->link;
p->link = r->link;
delete r;
--count;
itemDelete = true;
}
q = q->link;
}
我希望這對你有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.