Kasowanie elementów parzystych w liście jednostronnej

0

Witam. Chciałbym z Wami skonsultować jeden program. Chodzi o listę jednostronnie wiązaną, która kasuje elementy. Zacząłem od najprostszej sytuacji, gdzie mamy same liczby parzyste, więc lista po wykonaniu funkcji powinna być pusta. Program mi crashuje. Siedzę nad tym już dosyć długo, nigdzie nie znalazłem błędu. Prosiłbym o pomoc. Poniżej przedstawiam kod:

 
void delete_even (mode *&head)
{
	mode* p = head;
	
	while ( (head->vol)%2 == 0 && head != NULL)
	{
		if (head->next != NULL)
		{
			head = head->next;
			p->next = NULL;
			p=head;
		}
		
		if (head && head->next == NULL)
		head = NULL;
	}
1

kolejność sprawdzania warunków?

0

W istocie :). Próbuję z dalszą częścią, w razie czego będę pisał.

0
if (head)
	{
		while (p1->next != NULL)	 
		{
			while (p1->next != NULL && (p1->vol)% 2 != 0)
			p1 = p1 -> next;
			
			if (p1->next == NULL && p1->vol%2 == 0)
			{
				p1 = NULL;
				p1 = p2;
				p1->next = NULL;
			}	
		 
			if (p1->vol%2 == 0)
			{
				while (p2->next != p1)
				p2 = p2->next;
			
				p1->next = NULL;	
				p2->next = p2->next->next;
				p2 = p2->next;
				p1 = p2;
			}
			
		}
	} 

Aktualnie kod wygląda tak, jest to dalsza część, do której wchodzi po skasowaniu elementów parzystych od głowy i napotkaniu pierwszego nieparzystego. Nie wiedzieć czemu, crashuje mi przy kombinacji 11->12->11->12. Prosiłbym ponownie o pomoc.

0

Co to jest

p2 

?

Takie coś jest niepotrzebne.

p1->next = NULL;    
p2->next = p2->next->next;

W zupełności wystarczy

 p2->next = p2->next->next;
0
  1. Gdzie jest jakiekolwiek kasowanie? Ja widzę tylko zmiany wskaźników w węzłach.
  2. Co to jest p1, p2? Nazwy zmiennych powinny mówić do czego są. W dodatku pokazałeś kawałek kodu wyrwany z kontekstu i nawet nie wiadomo jak zostały zadeklarowane.

A przede wszystkim: po co to wszystko? Najpierw lecisz po parzystych, a potem nieparzystych, potem sprawdza milion warunków. Po co?
Algorytm jest prosty: lecisz po każdym elemencie w liście, jeśli dany element jest parzysty to usuwasz. Koniec. Jedna pętla.

0

Póki co pracujemy na lekcji bez kasowania. p1 to po prostu wskaźnik na dany element, a p2 to jego poprzednik służący do przepinania na coś, co jest po p1 (może trochę komplikuję). Następnie p1 jest przypisywane ponownie do p2 i pętla idzie dalej. Wybaczcie za długość kodu, zaczynam dopiero przygodę z algorytmami.

1
void delete_even (mode*& head)
{
    mode dummy;
    mode* prev = &dummy;
    prev->next = head;

    while (head)
    {
        if (<head_is_even>)
            do_something;
        else
        {
            prev = head;
            head = head->next;
        }
    }
}
0

Program nie skasuje pierwszej parzystej. I crashuje, jak wejdzie na pusty element listy, tak mi się wydaje.

@down:
Po prostu jak głowa przesunie się na puste miejsce, źle to ująłem. Ewentualnie jakiś błąd w rozumowaniu popełniam.

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