2015-05-21 79 views
0

我有從列表中刪除選定節點的問題。任務是刪除包含用戶選擇的數據的所有節點並對它們進行計數。例如刪除包含3的所有節點並對它們進行計數。函數應該返回整數與已刪除節點的數量。我的函數彈出節點的代碼和彈出包括特定數據的所有節點都在這裏。我使用Visual Studio 2012和調試說一些指針指向空間。內存讀取失敗。有什麼問題?鏈接列表:使用所選數據刪除節點

void pop(Node * head, Node * pointer) //delete node with given pointer 
{ 
    Node * p = head; 
    if (pointer == head) 
    { 
     head = p->next; 
     delete p; 
    } 
    else 
    { 
     while(p->next != pointer) 
     { 
      p = p->next; 
     } 
     p->next = pointer->next; 
     delete pointer; 
    } 
} 

int pop_all(Node * head, float data_out) //delete all nodes with proper data 
{ 
    Node * p = head; 
    int counter = 0; 
    while(p->next != NULL) 
    { 
    if (p->data == data_out) 
    { 
     pop(head,p); 
     counter++; 
    } 
    else 
    { 
     p = p->next; 
    } 

    } 

    return counter; 
} 
+0

很確定這應該被標記爲C. –

+0

您的代碼在第一次通過時不會正確地檢查1個元素(p-> next == NULL)的列表。 –

+0

請注意,通過pop_all()彈出一個元素一次後,您想要一個'p-> next',因爲現在刪除了完全相同的節點。 –

回答

0

首先一個問題:爲什麼一個家庭釀造列表,而不是std :: list。

然後建設性的批評:彈出功能有錯誤的簽名。如果刪除的節點如果列表中的第一個沒有辦法讓該函數告訴調用者該頭部已更改。通常我實現這樣的:

void pop(Node **head, Node *pointer) 
{ 
    for (; *head ; head = &((*head)->>next) 
     if (*head == pointer) 
     { 
      Node *temp = *head ; 
      *head = temp->next ; 
      delete p ;    
     } 
} 
+0

謝謝!我會嘗試這種方法。 – glebogryzacz

0

pop_all(),通話後pop(head,p)其中head != pp指向的內存你只是delete d。然後在while循環的頂部,請求p->next,這是未定義的。

+0

這就是原因。我會改變我的代碼。謝謝! – glebogryzacz