2014-05-14 99 views
1

我無法在列表中查找節點,然後刪除它。我嘗試了很多方法,但這是我的代碼。我不知道問題出在我的插入或可能在我的顯示功能?我「米幾乎沒有學習這一點。C++雙向鏈表搜索和刪除

void removeStudent(int id) 
{ 
    node *trash = NULL; 

    node *current = head; 
    while (current!= NULL) 
    { 
     if (current->data.id == id) 
     { 
      trash = current; 
      current->prev->next = current->next; 
      current->next->prev = current->prev; 
      delete trash; 


     } 
    } 


} 

這是我的插入功能

void push(student s) 
{ 

    node *tmp = new node; 
    tmp->data = s; 
    tmp->next = head; 
    tmp->prev = NULL; 

    if (head == NULL) 
    { 
     head = tmp; 
     tail = tmp; 
    } 
    else 
    { 
     head->prev = tmp; 
     head = tmp; 
    } 

} 

,這是我的顯示功能

void display() 
{ 
    node *current = head; 

    while (current!=NULL) 
    { 
     cout << current->data.name << endl; 
     cout << current->data.GPA << endl; 
     cout << current->data.id << endl; 
     cout << current->data.university << endl; 
     current = current->next; 
    } 
} 
+0

爲什麼'node * trash = new node;'?這會泄漏內存。 – crashmstr

+0

您必須在列表的開始或結尾(或兩個)處理節點的特殊情況。這個提示是否足夠? – Beta

+0

'我嘗試了很多方法'應該只有一種方法,它就是你寫下或畫在紙上的方式。當你有這樣的任務時,可以用框和線來表示節點和鏈接。然後,您會看到需要做些什麼才能使中間節點解除鏈接並將其餘兩個節點鏈接在一起。然後你編寫代碼來模擬你在紙上寫的內容。 – PaulMcKenzie

回答

0

請嘗試以下操作。我想你的類也包含數據成員尾部。

void removeStudent(int id) 
{ 
    node *current = head; 

    while (current != NULL && current->data.id != id) current = current->next; 

    if (current != NULL) 
    { 
     if (current->prev != NULL) current->prev->next = current->next; 
     else head = current->next; 

     if (current->next != NULL) current->next->prev = current->prev; 
     else tail = current->prev; 

     delete current; 
    } 
} 

如果你的類沒有數據成員的尾巴,那麼你必須從功能清除體內聲明

 else tail = current->prev; 

0
node *trash = new node; 
trash = current; 

內存泄漏,因爲你失去的內存分配newin的第一行,你不保留一個指針的內存。你分配指針trashcurrent一。

你應該只做到這一點:

node *trash = NULL; // declare a pointer and set it to NULL 

提示:

當列表處理,以測試你的代碼中使用的紙和一支鉛筆,創建一個小名單,並在紙上運行從列表的開始和結束脩改(這裏刪除)一個節點的情況。

此外,當列表只有一個節點時會發生什麼,當它爲空時會發生什麼。

0

current = current->next;在循環結束?

+0

我忘了:(但我剛剛添加它,它給了我一個錯誤,在這一行current-> next-> prev = current-> prev; – user3612662

+0

你必須檢查current-> next在分配current-> next之前存在 - > prev,反之亦然,否則在前後節點刪除時會出現可預見的問題 – bigblackdot