2015-05-21 2 views
0

У меня проблема с удалением выбранного узла из моего списка. Задача состояла в том, чтобы удалить все узлы, которые включают данные, выбранные пользователем, и подсчитать их. Например, чтобы удалить все узлы, которые содержат 3, и считать их. Функция должна возвращать целое число с количеством удаленных узлов. Мой код для функции pop node и для pop всех узлов, включая конкретные данные, находится здесь. Я использую 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.

Тогда конструктивная критика: функция pop имеет неправильную подпись. Если удаленный узел, если в первом списке нет способа, чтобы функция сообщила вызывающему абоненту, что голова была изменена. Обычно я реализую как это:

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 != p, p указывает на память просто delete d. Затем в верхней части цикла while вы запрашиваете p->next, что не определено.

+0

Вот в чем причина. Я изменю свой код. Благодаря! – glebogryzacz

Смежные вопросы