2016-02-06 55 views
-2

這段代碼是從C++ primer plus複製而來的。我認爲一些 步出隊功能是不必要的。但書 說這很重要,我不明白。我希望有人能給我更詳細的解釋。這裏是隊列的定義。隊列類中刪除節點的過程

typedef unsigned long Item; 
class Queue 
    { 
    private: 
     struct Node{ Item item; struct Node * next; }; 
     enum{ Q_SIZE = 10 }; 
     Node * front; 
     Node * rear; 
     int items;    // the number of item in the queue 
     const int qsize; 
     Queue(const Queue & q) :qsize(0){}; 
     Queue & operator=(const Queue & q){ return *this; } 
     Queue & operator=(const Queue & q){ return *this; } 
    public: 
     Queue(int qs = Q_SIZE); 
     ~Queue(); 
     bool isempty()const; 
     bool isfull()const; 
     int queuecount()const; 
     bool enqueue(const Item & item); 
     bool dequeue(Item & item); 
    }; 

bool Queue::dequeue(Item & item) 
{ 
    if (isempty()) 
     return false; 
    item = front->item; 
    Node * temp; 
    temp=front;    // is it necessary 
    front = front->next; 
    items--; 
    delete temp; 
    if (items == 0) 
     rear = NULL; //why it is not front=rear=Null ; 
    return true; 
} 
+0

順便說一句,這是一個絕對可怕的書。 – ildjarn

回答

0

該隊列中的節點存儲爲指針。要實際創建一個節點,像Node* tmp = new Node()這樣的一些代碼可能在enqueue-Function中的某處。

With front = front->next;指向第一個元素的指針被移動到隊列中的下一個元素。但是以前的front-node?通過移動指針我們「忘記」它的地址,但我們不刪除對象或釋放內存。我們必須使用delete這樣做,這就是爲什麼地址暫時存儲以調用刪除。不刪除它會導致內存泄漏。

關於你的第二個問題:front指針已經被移動到front->next。如果隊列中只有一個元素,那會是什麼情況?可能NULL,這應該由enqueue功能來保證。 (「請注意:如果你正在管理這個代碼,這是一個好主意nullptr更換NULL)。 未得到更新,卻又是rear唯一的變數

+0

感謝您的幫助! – Ryan

0
temp = front; 

保存一個指針到前部元件,因此它可以front已被修改之後被刪除。

如果隊列爲空,front = front->next;已將front設置爲空,因此不需要再次執行。

+0

感謝您的幫助! – Ryan