Usuwanie osób z listy jednokierunkowej

0

Klasyczna lista jednokierunkowa, dodawanie, usuwanie, wyświetlanie osób itp. Otóż mam właśnie problem z usuwaniem osób. Rozumiem, iż oddzielnie powinienem usuwać pierwszy element, gdyż muszę przesunąć wskaźnik na początek, zaś w usuwaniu elementów ze środka powinienem usunąć element, a później, żeby nie było dziury, przesunąć wskaźnik na następny element.

Poniższy kod powinien działać, tak, że np. Posiadam listę 10 Kowalskich oraz 5 Różalskich, teraz wpisuję nazwisko Kowalski i program powinien usunąć mi wszystkich Kowalskich.
Gdy dodam tylko jednego Kowalskiego na pierwszą pozycję i go usunę, wszystko działa, gdy po tym jednym Kowalskim na pierwszej pozycji, dodam czterech Różalskich i usunę wszystkich Różalskich program również zadziała. Program wysypuję się tylko wtedy jeśli mam np. Kowalskiego na pierwszej pozycji, później załóżmy dwóch Różalskich i znowu 3 Kowalskich. Teraz gdy będę chciał usunąć Różalskich, wszystko zadziała, zaś gdy usunę Kowalskich program się wysypię. Wystarczy, że mój element jest na pierwszej i na jakiejś innej pozycji, wtedy jest błąd. Sądzę, że coś w pętli namieszałem.

#pragma once
struct Node{
	char name[20],surname[20];
	int age, height;
	Node *next;
} *start=NULL;


void RemovePerson(){
	char deletePerson[20];
	printf("Enter the Surname: ");
	scanf_s("%s", deletePerson, 20);

	if(start==NULL)
			printf("Empty List\n");
	else{
		if(strcmp(deletePerson,start->surname)==0){
			Node *tmp=start;
			start=start->next;
			free(tmp);
		}

		Node *current=start, *previous=start;
		while(current!=NULL){
			if(strcmp(deletePerson,current->surname)==0){
				previous->next=current->next; 
				free(current); 
				current=previous;
			}
			else{
				previous=current;
				current=current->next;
			}
		}
	}
}
0

Jeśli już masz current i previous, to upewnij się, że w każdym przebiegu pętli rzeczywiście zawsze są to elementy bieżący i poprzedni. Na początku pętli to już nie jest prawda, bo oba są równe start.

0

Tak faktycznie, zapomniałem, ale nawet jak ustawię previous na NULL, czy start a current na start->next to i tak jest ten sam błąd, w między czasie zdążyłem zrobić cały program i została mi tylko sekcja z usuwaniem.

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