Usuwanie pewnych elementów z listy

0

Cześć,
Mam za zadanie usunąć z listy elementy, których długość jest większa niż podana przez użytkownika.

struct List{
    string _val;
    List *next;
    };

void delete_by_length(List *&H){

    int max_length, length;
    cout<<"podaj max: ";cin>>max_length;

    while(H != NULL){
        length = H->_val.length();
        List* p=H->next;
        if(length>max_length){
          delete H;
          H=p;
        }
        }

    
    save(H);

}

Nie rozumiem dlaczego ww. funkcja nie działa.

0

Dopisz jeszcze else po warunku czyli co zrobić gdy nie trzeba kasować danego elementu.

0
Delor napisał(a):

Dopisz jeszcze else po warunku czyli co zrobić gdy nie trzeba kasować danego elementu.

Pomimo dodania else ww. funkcja usuwa całą zawartość listy.

1

Problemem jest to, że używasz referencji na listę, więc cały czas trzymasz wskaźnik na pierwszy element.
Tak samo nie rób nic związanego z UI w tej funkcji:
Zacznij od czegoś takiego:

void delete_by_length(List *&H, int maxLen)
{
    List **current = &H;

    while(*current != nullptr) {
         ....
         current = &(*current)->next;
    }
}
0

Naprawiłem ten błąd. Funkcja poprawnie usuwa elementy, jednak po tym dzieje się coś takiego.
Screenshot - 2019-01-19 , 16_05_55.png

void delete_by_length(List *&H){

    int max_length, length;
    cout<<"podaj max: ";cin>>max_length;
    List *p=H;


    while(p){
        length = p->_val.length();
        if(length>max_length){
            delete p;
        }
        p=p->next;
    }
save(H);
}
0

Po pierwsze robisz delete p; a po chwili p=p->next; czyli odwołujesz się do zwolnionej pamięci.
Po drugie: usuwasz elementy listy ale nie uaktualniasz pozostałych elementów.
Po trzecie: funkcja wczytuje i wypisuje ciągi znaków a ma tylko kasować elementy listy.

0
Delor napisał(a):

Po pierwsze robisz delete p; a po chwili p=p->next; czyli odwołujesz się do zwolnionej pamięci.
Po drugie: usuwasz elementy listy ale nie uaktualniasz pozostałych elementów.
Po trzecie: funkcja wczytuje i wypisuje ciągi znaków a ma tylko kasować elementy listy.

Poprawiłem

void delete_by_length(List *&H, int max_length){
    int  length;
    List *p=H;

    while(p){
        List *e=p;
        p=p->next;
        length = e->_val.length();
        if(length>max_length){
            delete e;
            e=p;
        }
    }
 save(H);
}

Nadal ten sam problem

0
List *e=p;

Do e przypisujesz wartość p. Czyli operujesz na kopii wartości p->next z poprzedniego kroku a nie na p->next.

0
Delor napisał(a):
List *e=p;

Do e przypisujesz wartość p. Czyli operujesz na kopii wartości p->next z poprzedniego kroku a nie na p->next.

Doceniam chęć pomocy, ale niewiele dała mi ta wskazówka xD

0
e=p->next;
e=nullptr;

Wartość p->next zmieni się po wykonaniu takiego kodu?

0
p=p->next;
p=nullptr;

Wartość p->next z początku nadal nie jest zmieniona.

e=p;
p=p->next;
p=e;

Tu nadal to samo...
Zmieniasz wartość p i wartość e ale nie p->next.
Jeżeli chcesz zmienić p->next to zapamiętaj rodzica lub adres zmiennej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1