• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dwukierunkowa- usuwanie

Object Storage Arubacloud
0 głosów
1,118 wizyt
pytanie zadane 16 stycznia 2017 w C i C++ przez Smileandlove Nowicjusz (230 p.)

Witam. Jestem w trakcie tworzenia projektu zaliczeniowego i potrzebuję pomocy. Tworzę listę dwukierunkową i mam problem z usuwaniem elementów. Staram się wypatrzeć błąd, ale niestety go nie widzę. Funkcja po podaniu nazwiska powinna usuwać osobę o takim nazwisku. Działa usuwanie z listy osoby, której nazwisko się na tej liście znajduje. Jednak gdy wpiszę jakieś losowe nazwisko, którego nie ma na liście, zamiast pokazać się komunikat o braku takiej osoby, program się po prostu zawiesza. Kiedy usunęłam if z komunikatem program wciąż się zawieszał po wpisaniu nieprawidłowego nazwiska, dlatego wydaje mi się, że problem może tkwić jeszcze w pętli while. Proszę o pomoc.

 

void usun_osobe()
{
    O *ind = first;             //Ustawiamy nowy wskaźnik na pierwszym elemencie listy
    char nazwisko[20];

    system("cls");

    cout<<"Nazwisko: "<<endl;
	cin.getline(nazwisko, sizeof(nazwisko));

    while(strcmp(ind->nazwisko, nazwisko) && ind!=NULL)  
    {

        ind = ind->next;
    }




if (ind == NULL)
    {
        cout<<"Nie odnaleziono takiej osoby"<< endl;
        return;
    }
        
     else
       {
        O * ind2 = ind->next;           
        globalne_id--;
        while(ind2!=NULL)
        {
            ind2->id--;                 
            ind2 = ind2->next;          
        }
    }


    if (ind->prev == NULL)       
    {

        first = ind->next;
        O *next = ind->next;
        next->prev = NULL;        
    }
    else if (ind->next == NULL)    
    {

        last = ind->prev;          
        O *previous = ind->prev;
        previous->next = NULL;         
    }
    else
    {

        O *previous = ind->prev;            
        previous->next = ind->next;        
        O *next = ind->next;
        next->prev = ind->prev;
    }
    free(ind->data_urodzenia);
    free(ind);                 
}

 

1 odpowiedź

0 głosów
odpowiedź 16 stycznia 2017 przez mbabane Szeryf (79,280 p.)
edycja 16 stycznia 2017 przez mbabane

linia 11:

Czy tam nie powinno byc or zamias and? Bo chyba wystarczy, ze tylko jedno musi byc spelnione aby petla sie zakonczyla badz kontynuowala

komentarz 16 stycznia 2017 przez Smileandlove Nowicjusz (230 p.)
Jak się zmieni and na or to przestaje działać nawet usuwanie nazwisk, które są na liście :(
1
komentarz 16 stycznia 2017 przez mbabane Szeryf (79,280 p.)

Rozumiem ze ta lista nie jest cykliczna (tzn. ostatni element nie wskazuje na pierwszy).

problem moze lezec tez w tym ze jesli nie ma nazwiska na liscie to strcmp() jako jeden ze swoich argumetnow przyjmie nula, muszisz chyba zrobic to w ten sposob:


    while( ind!=NULL)  
    {
        if (strcmp(ind->nazwisko, nazwisko) ) break;
        ind = ind->next;
    }

 

komentarz 16 stycznia 2017 przez Smileandlove Nowicjusz (230 p.)

Dziękuję bardzo. Konkretnie napisałam to tak: 

while( ind!=NULL)
{
    if (!strcmp(ind->nazwisko, nazwisko) )
    {
        break;
    }
    ind = ind->next;
}



if (ind == NULL)
    {
        cout<<"Nie odnaleziono takiej osoby"<< endl;
        system("pause");
        return;
    }

 

Z jakiegoś powodu komunikat o braku takiej osoby dosłownie tylko migał na ekranie, dlatego dodałam system("pause")

Podobne pytania

0 głosów
1 odpowiedź 333 wizyt
0 głosów
1 odpowiedź 261 wizyt
0 głosów
1 odpowiedź 805 wizyt

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...