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

Lista jednokierunkowa - usuwanie

Object Storage Arubacloud
+1 głos
149 wizyt
pytanie zadane 5 czerwca 2020 w C i C++ przez kamylmeister Nowicjusz (190 p.)
void lista::usun_osobe_nazwisko(string nazwisko)
{
	osoba* temp = pierwsza;

	while (temp)
	{
		if (pierwsza->nazwisko == nazwisko)
		{
			pierwsza = pierwsza->nastepna;
		}

		else if (temp == 0)
		{
			delete temp;
			break;
		}

		else if (temp->nazwisko == nazwisko)
		{
			osoba* usuwana = temp;
			delete usuwana;
		}

		temp = temp->nastepna;
	}
}

Dzień dobry,

Void powinien usuwać osoby o podanym przez użytkowanika nazwisku. Void działa tylko, jeżeli wszystkie osoby na liscie jednokierunkowej mają dokładnie to samo nazwisko, w innych przypadkach program się wywala. Jakies porady?

 

1 odpowiedź

0 głosów
odpowiedź 5 czerwca 2020 przez Jacob99 Obywatel (1,840 p.)
void lista::usun_osobe_nazwisko(string nazwisko) // Użyj const std::string&. Kopiowanie stringów jest kosztowne czasowo, a tutaj zupełnie niepotrzebne.
{
    // Rozumiem  że `pierwsza` to jest głowa kolejki?
    osoba* temp = pierwsza;
 
    while (temp)
    {
        if (pierwsza->nazwisko == nazwisko)
        {
            pierwsza = pierwsza->nastepna;
        }
 
        else if (temp == 0) // Ten przypadek nigdy nie zajdzie
        {
            delete temp; // Ponadto po co usuwać nullptr?
            break;
        }
 
        else if (temp->nazwisko == nazwisko)
        {
            osoba* usuwana = temp;
            delete usuwana; // Tutaj zwalniasz pamięć ...
        }
 
        temp = temp->nastepna; // ... a tutaj odwołujesz się do zwolnionej pamięci. Crash.
    }
}

Ten kod można poprawić i zrobić bardziej czytelnym:

// Usuwa z listy wszystkie osoby z nazwiskiem takim jak `surname`
lista::remove_by_surname(const std::string& surname)
{
    osoba *current = head;
    osoba *prev = nullptr;

    while(current)
    {
        if(current->surname == surname)
        {
            if(prev)
           {
                prev->next = current->next; //Aby zachować ciągłość kolejki
                delete current;
                current = prev->next
            }
            else
            {
                prev = current->next;
                delete current;
                current = prev;
                prev = nullptr;
            }
            // break; // Jeśli chcesz usunąć tylko pierwsze wystąpienie na liście
        }
        else
        {
            prev = current;
            current = current->next;
        }
    }
}

 

Podobne pytania

0 głosów
0 odpowiedzi 243 wizyt
pytanie zadane 25 kwietnia 2018 w C i C++ przez damianoom Nowicjusz (240 p.)
0 głosów
2 odpowiedzi 181 wizyt
pytanie zadane 13 sierpnia 2023 w C i C++ przez Janchess Początkujący (480 p.)
–1 głos
1 odpowiedź 1,493 wizyt
pytanie zadane 15 stycznia 2017 w Algorytmy przez Mariusz M Obywatel (1,640 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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!

...