2015-12-03 84 views
1

我的目錄結構是這樣的:如何刪除雙向鏈表中的第一個節點?

struct Node { 
    Node *next; 
    Node *prev; 
    T datum; 
}; 
Node *first; // points to first Node in list, or 0 if list is empty 
Node *last; // points to last Node in list, or 0 if list is empty 

我試圖做到以下幾點:

void pop_front() 
{ 
    //copied from lecture slides 
    assert(!empty()); 
    Node *victim = first; 
    first = first->next; 
    if(first != 0) 
    { 
     first->prev = 0; 
    } 
    delete victim; 
    victim=0; 
} 

的問題是,它給了我一個內存泄漏,當我做刪除受害線。我不知道什麼是錯的。

編輯:這是怎麼了添加節點:

//MODIFIES: this 
    //EFFECTS: inserts i into the front of the list 
    void pushit_tofront(const T &datum) 
    { 
     //if list is empty, update both the first and last element 
     //copied from lecture slides 
     Node *p = new Node; 
     p->datum = datum; 
     p->next = first; 
     if(empty()) 
     { 
      first = last = p; 
     } 
     else 
     { 
      first = p; 
     } 

    } 
+0

你怎麼知道它給你一個內存泄漏? –

+0

這就是它的意思:「錯誤的對象0x100102c80:被釋放的指針沒有被分配 ***在malloc_error_break中設置一個斷點來調試 」 – pigthatatepens

+1

Off topic:推薦用'nullptr'和'victim'代替那些'0' = 0;'沒多大用處。它即將超出範圍。 – user4581301

回答

-2

關於學術誠信的問題,我不打算髮布的解決方案,因爲這是一個受歡迎的分配。

不過,我會給你一些指點:)你在做你有一個雙鏈表的突變(你的情況)

隨時在最多六個三分球擔心。

curr->next = ? 
curr->prev = ? 
next->prev = ? 
next->next = ? 
head = ? 
tail = ? 

如果您確切地確保所有這些指針正確管理,您可能會解決您當前的問題。

+0

不是downvoter,因爲你大多是正確的。我建議一個編輯來改善:最有可能是未初始化的指針,而不是空指針。你可以''刪除'空指針就好了。 'delete'檢查並且對空指針不做任何事情。它也可能是未示出的代碼中的一個bug,它會踐踏「第一個」。沒辦法知道肯定。 – user4581301

+0

這就是我所想的,這就是爲什麼我建議所有要管理的指針。我的猜測是海報倒票,因爲我沒有給他們代碼。 – 0111

0

嘗試使用此代碼爲節點

class Node { 
    public: 
     int get() { return object; }; // returns the value of the element 
     void set(int object) { this->object = object; }; // set the value of the element 

     Node* getNext() { return nextNode; }; // get the address of the next node 
     void setNext(Node* nextNode) // set the address of the next node 
     { this->nextNode = nextNode; }; 

     Node* getPrev() { return prevNode; }; // get the address of the prev node 
     void setPrev(Node* prevNode) // set the address of the prev node 
     { this->prevNode = prevNode; }; 

private: 
     int object; // it stores the actual value of the element 
     Node* nextNode; // this points to the next node 
     Node* prevNode; // this points to the previous node 
    }; 

雙向鏈表這個樣子是未完成。但你必須在其中添加刪除功能。

class DoublyList 
{ 
public: 
     List(); 
     void add (int addObject); 
     int get(); 
     bool next(); 
     void start(); 
     void remove(); 


private: 
     int size; 
     Node * headNode; 
     Node * currentNode; 
     Node * lastCurrentNode; 
}; 

雙重鏈接列表刪除它將從任何位置刪除。如果條件能夠幫助你,你已經詢問了最後兩個節點的第一個節點。

DoublyList::remove(){ 
    Node *removeNode= currentNode; 

    if((currentNode->getNext()!=null)&&(currentNode->getprev())!=headNode)){ // it will remove the node in middle 
    lastCurrentNode->setNext(currentNode->getNext()); 
    (currentNode->getNext())->setPrev(currentNode->getPrev); 
    currentNode= currentNode->getNext(); 
    } 

    if((currentNode->getprev())!=headNode)&&(currentNode->getNext()==null)){ // it will remove the node if it is last node 
    lastCurrentNode->setNext(null); 
    currentNode= lastCurrentNode; 
    lastCurretnNode= currentNode->getPrev(); 
    } 

    if((currentNode->getprev())==headNode)&&(currentNode->getNext()==null)){ //if it is at the start and next node is null 
     headNode->setNext(null); 
    lastCurrentNode= headNode; 
    currentNode= headNode; 
    } 

     if((currentNode->getprev())==headNode)&&(currentNode->getNext()!=null)){ //if it is at the start and next node is not null 
     headNode->setNext(currentNode->getNext()); 
     (currentNode->getNext())->setPrev(headNode); 
    lastCurrentNode= headNode; 
    currentNode= currentNode->getNext(); 
    } 



    delete removeNode; 
    size--; 
} 

我想你正在嘗試使用雙向鏈接列表進行堆棧。但在你的問題中並不清楚。所以我已經在所有條件下編寫了刪除方法。我沒有測試過這個代碼,你必須自己做。如果有任何錯誤,你可以聯繫我。