2013-03-26 50 views
3

基本上,我使用的是鏈表,試圖模擬人在商店在一天的過程中排隊執行隊列中,他們等到的人在他們面前結束自己的業務。前幾個人經歷的很好,但是當我到達第二次出隊時,它會默認我。 gdb調試器說錯誤來自這一行head = current-> next; (當前=頭)。與段錯誤出列功能

這裏是我出列功能:

void BankQueue::dequeue() 
    { 
     Node* current=head; 
     head=current->next; 
     if(head!=NULL) 
     { 
      head->prev=NULL; 
     } 
     delete current; 
    } 

這裏是排隊功能(如果入隊我正在引起內存泄漏時):

void BankQueue::enqueue(Customer s) 
    { 
     Node* node= new node; 
     node->data=s; 
     node->next=NULL; 
     if(tail==NULL) 
     { 
       head=node; 
       tail=node; 
       node->prev=NULL; 
     } 
     else 
     { 
       node->prev=tail; 
       tail->next=node;; 
       tail=node; 
     } 

任何幫助你們可以爲提供到段落可能發生的地方將是驚人的,在此先感謝。如果必要的話

P.S.I可以提供更多的信息。

+0

你在做任何事情的析構函數的任何機會'Node'好笑嗎?我唯一看到的是,在'dequeue'函數(這裏:'head = current-> next;')中使用它之前,你不檢查'head'('current')是否爲'NULL'。如果在空隊列中出隊,這將會出現段錯誤。 **編輯:**啊,我認爲這是問題,因爲'dequeue'不會重置'enqueue'使用的'tail'指針。 – paddy 2013-03-26 02:14:51

回答

1

dequeue功能是有缺陷的。看,如果head要成爲NULL會發生什麼:

void BankQueue::dequeue() 
{ 
    // current == NULL 
    Node* current = head; 
    // Setting head to NULL->next 
    // This will reference memory location 0x00000000 + (some offset) 
    head=current->next; 
    // This is undefined, but it most likely will return true 
    if(head!=NULL) 
    { 
     // undefined 
     head->prev=NULL; 
    } 
    // Delete NULL 
    delete current; 
} 

而且,是的,tail需要在那裏被更新了。

// After you've made sure that head is valid 
if (head == tail) { 
    // there is only node, so we just clear tail 
    tail = NULL; 
} 
// Then you proceed with removal 

托馬斯,響應您的評論:

void BankQueue::dequeue() 
{ 
    // If the queue has instances 
    if (head) 
    { 
     // If there is only one instance 
     if (head == tail) 
     { 
      tail = NULL; 
     } 

     // set the new head 
     head = head->next; 
     // delete the old head if it exists 
     if (head->prev) 
     { 
      delete head->prev; 
     } 
     // null data 
     head->prev = NULL; 
    } 
} 
+0

所以我想將if(head == tail)放在哪裏?另外,我是否需要在if(head!= NULL)中放置head = current-> next? – Thomas 2013-03-26 02:44:31

+0

我用我爲你鞭打的功能編輯了我的答案。 – 2013-03-26 02:50:00

+0

真棒謝謝 – Thomas 2013-03-26 03:56:52

0

我有意見,但我會擴大,因爲我認爲這是最有可能的問題。

dequeue功能不重置tail指針。因爲enqueue函數使用它來確定隊列是否爲空,所以如果您清空隊列並再次將項目放入隊列中(因爲head將爲NULL),您將遇到問題。

+0

你能詳細說明我將如何重置尾指針? – Thomas 2013-03-26 02:42:18

+0

是的,當你出列並發現新的'head'是'NULL'時,你還必須將'tail'設置爲'NULL'。這應該對你有意義,因爲如果沒有頭,也沒有尾巴。 – paddy 2013-03-26 03:52:18

0
在出隊

提出一個條件,如果回報(頭!);作爲第一線。正如所建議的那樣,你將在那之後設置。