簡體   English   中英

在鏈表上插入 function 不起作用

[英]insert function on a linked list doesn't work

在我的單鏈表上插入 function 不起作用。 我已將問題縮小到 while 循環語句。 由於該語句具有 AND 運算符,因此整個語句的計算結果為truefalse 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.

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