удаление всех определенных ключей, найденных в связанном списке - PullRequest
1 голос
/ 25 февраля 2012

Я пытаюсь удалить все определенные ключевые элементы в моем связанном списке в одной функции. то есть если связанный список имеет 1 2 2 3 4 4 5 5 8 2 6 32 4 6 7 7, тогда, если я передам функцию 2, эта функция удалит все 2 в связанном списке

мой связанный список здесь

class float_list
{
     struct node
    {
        double data;
        struct node *next;
     };
        node *head;
public:

    float_list(void)
    {
        head = nullptr;
    };

    void appendNode(double);
    void print_list();
    void deleteNode(double);

};

теперь мой deleteNode (здесь двойник)

void float_list::deleteNode(double num)
{
    node *nextptr, *previousptr = nullptr;
    nextptr=head;
    if(!head->data){return;}
    if(head->data==num)
    {
        nextptr= head->next;
        delete head; 
        head = nextptr;
    }
    else
        while(nextptr)
        {
            previousptr= nextptr;
            if(nextptr->data==num)
            {
                previousptr->next = nextptr->next;  
                delete nextptr;
                cout<<"I Found the  --> "<<num<<"  is going to be deleted"<<endl;
                nextptr = previousptr; 
                //nextptr = nextptr->next;
            }
            nextptr = nextptr->next;
        }
        delete nextptr;
        delete previousptr;
}

Я пытался разными способами, но всегда получаю ошибку нарушения прав доступа. Пожалуйста, дайте мне концептуальные и кодовые подсказки, если это возможно. Спасибо код в приложении win32 Vs2010

Ответы [ 4 ]

1 голос
/ 25 февраля 2012

Что происходит после окончания цикла while.Ну, nextptr == NULL.удалить NULL == проблема.

Попробуйте это:

node *previous = nullptr, *current = head, *temp;

while(current){
    temp = current->next;
    if(abs(current->data - num) < MARGIN_OF_ERROR){
        if (previous){
            previous->next = current->next;
        } else {
            head = current->next;
        }
        delete current;
    } else{
        previous = current;
    }
    current = temp;
}
1 голос
/ 25 февраля 2012

как то так (псевдокод)

public void removeData( double data )
{
    if ( this.node == null ){ return; }
    if ( this.node->data == data ){
        this.node = this.node.node;
    }
    this.node.removeData( data );
}
1 голос
/ 25 февраля 2012

Я могу проследить две проблемы:

  1. Вы никогда не должны использовать operator== для проверки равенства двух плавающих числа точек, есть проблема с арифметикой с плавающей точкой - они не точны, и результат может быть не таким, как вы ожидаете [не решение вашей проблемы, а определенно проблема]
  2. Ваши previousptr и nextptr - это одно и то же [они оба указывают на один и тот же адрес!]. Вы должны изменить previousptr перед текущей итерацией. [прямо перед nextptr = nextptr->next;]. Из-за этого при удалении nextptr и позже установите:

            nextptr = previousptr; 
            nextptr = nextptr->next;
    

Вы фактически получаете доступ к элементу, который только что удалили, что вызывает ваш незаконный доступ.

0 голосов
/ 08 августа 2012

Возможно, это можно сделать с помощью рекурсии, но вот решение с подвижным указателем:

void removenumber(node **head, int value)
{

    node * current;
    node * prev;
    node * tmp;
    current = (*head);

    if ( current == NULL) return;

    prev = current;
    current = current->next;
    while( current!= NULL && current->next != NULL)
    {   
        if ( current->data == value)
        { //remove current
            tmp = current->next;
            prev->next = current->next;
            free(current);
            current = tmp;
            //previous is the same
            continue;
        }

        current = current->next;
        prev = prev->next;
    }

    // now current->next != NULL check it
    if(current!=NULL) //what is current was deleted?
    {
        if(current->data == value )
        {
            prev->next = NULL;
            free(current);
        }
    }

    if ( (*head)->data == value) //remove head
    {
        tmp = (*head)->next;
        free(*head);
        *head = tmp;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...