Usuwanie całej listy jednokierunkowej

0

Witam mam podpiętą listę i np chce ją całą usunąć napisałem coś takiego :


struct song
{
	string title;
	song*next;
};
struct cd{
	string name;
	cd *next;
	song *first;
};

 void delsongs(cd*&head)
{
	if (head->first == NULL)return;
	else
	{
		song*head1 = head->first;
		while (head1 != NULL)
		{
			delete head1;
			head1 = head1->next;
		}
		head->first = NULL;
	}

}

Czyli wcześniej mam funkcję która zwraca mi płytę z której chce piosenki usuwać.Sprawdzam czy wskaźnik na podpiętą liste nie jest 0 jak jest to wracam,a jak nie to robię nową zmienną przechodzę po liście usuwam ją,a na koniec wskaźnik na pierwszy element ustawiam na NULL,wydaję mi się,że jest dobrze,ale jednak coś nie działa.Widać na pierwszy rzut oka czy coś źle jest czy mam cały kod podac?

0
            delete head1;
            head1 = head1->next;

head1 zostało usunięte, a w następnej linii próbujesz czytać head1->next. To UB.

Jest jakiś powód dla którego nie korzystasz z kontenerów standardowych, np. std::vector lub std::list?

0
delete head1;
head1 = head1->next;

Zastanów się do czego się odwołujesz tutaj w 2 linijce.

0

Fakt dziękuję poprawiłem tak:

 void delsongs(cd*&head)
{
	if (head->first == NULL)return;
	else
	{
		song*temp;
		song*head1 = head->first;
		while (head1 != NULL)
		{
			temp = head1->next;
			delete head1;
			head1 = temp;
		}
		head->first = NULL;
	}

0

A fakt,że nie używam tych kontenerów jest taki ,że mój projekt polega właśnie na implementowaniu listy i działania na niej.

1

Dalej masz błąd: head->first = NULL; też działa na usuniętych danych.

void delsongs(cd* head) {
    if (head == NULL)
        return;

    cd* tmp = head->next;
    while (tmp != NULL) {
        delete head;
        head = tmp->next;
    }
}

Czyż nie wygląda to zdecydowanie schludniej i czytelniej?

1
void delsongs(cd* head) {
    while (head != NULL) {
        cd* tmp = head->next;
        delete head;
        head = tmp;
    }
}

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