[英]insert function on a linked list doesn't work
在我的單鏈表上插入 function 不起作用。 我已將問題縮小到 while 循環語句。 由於該語句具有 AND 運算符,因此整個語句的計算結果為true
或false
。 while(value > nodePointer->value && nodePointer != nullptr)
這是我寫的,它不起作用
while(nodePointer != nullptr && value > nodePointer->value)
我試過了,它確實有效,但我不知道為什么
如果這一切都將評估為真或假,那么為什么順序很重要?
class NumberList
{
private:
struct listNode
{
double value;
struct listNode *next;
};
listNode *head;
public:
NumberList()
{
head = nullptr;
}
void appendNode(double);
void insertNode(double);
void deleteNode(double);
void displayNode();
};
void NumberList::insertNode(double value)
{
listNode* newNode;
listNode* nodePointer;
listNode* previousPointer;
newNode = new listNode;
newNode->value = value;
newNode->next = nullptr;
if (!head) //if nothing in the list
{
head = newNode;
newNode->next = nullptr;
cout << "check1" << endl;
}
else
{
nodePointer = head; //initial placement and reset
previousPointer = nullptr;
cout << "check2" << endl;
while (value > nodePointer->value && nodePointer != nullptr)
{
previousPointer = nodePointer;
nodePointer = nodePointer->next;
cout << "check3" << endl;
}
if (previousPointer == nullptr) //if the value needs to be inserted at the front
{
head = newNode; //head points to newly instered node
newNode->next = nodePointer;//newly insterted node points to the next node
cout << "check4" << endl;
}
else//everywhere else
{
previousPointer->next = newNode;
newNode->next = nodePointer;
cout << "check5" << endl;
}
}
}
while (value > nodePointer->value && nodePointer != nullptr)
當nodePointer
到達路的盡頭變成NULL
時,上述條件會先檢查nodePointer->value
,然后再檢查nodePointer
是否為NULL
。 這不會有好的結局。
您需要檢查NULL
指針作為這里的首要業務,然后再對它進行任何其他操作,例如想知道它指向的 object 的value
是多少。 &&
運算符首先評估左側,並且僅在需要時評估右側。 如果左側為false
,則不評估右側。 這就是它的工作原理。
如果這一切都將評估為真或假,`
那是你的錯誤,它不會被評估。 在表達式A && B
中,如果A
計算結果為 false,則根本不會計算B
這有時稱為短路評估。
現在看看你的兩個版本, nodePointer
是 null。
while (value > nodePointer->value && nodePointer != nullptr)
在這種情況下nodePointer->value
會導致錯誤,您不能取消引用 null 指針。 現在另一個版本
while (nodePointer != nullptr && value > nodePointer->value)
在此代碼nodePointer != nullptr
為 false,因此value > nodePointer->value
不會被評估,因此不會導致錯誤。 這就是區別。
類似的規則適用於A || B
A || B
。 在這個表達式中,如果A
計算結果為真,則B
根本不會被計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.