Usuwanie elementu z listy jednokierunkowej

0

Witam, mam problem.
Chciałbym usunąć dokładnie 1 element z listy.
Algorytm wygląda tak:

int stoper=0;
                    char slowo[50];
                printf("jakie słowo polskie chcesz usunąć? ");//zad F
                scanf("%s",slowo);
                ADRES pom3=pierwszy,usuwanie=NULL;
 while(pom3!=NULL){
                        if((strcmp(slowo,pom3->polskie)==0)&&stoper==0){
                            usuwanie=pom3;
                            pom3=pom3->nast;
                            free(usuwanie);
                            pierwszy=pom3;
                            break;
                        }
                        stoper++;
                        if(strcmp(slowo,pom3->nast->polskie)==0){
                                usuwanie=pom3->nast;
                            pom3=usuwanie->nast;
                        free(usuwanie);
                        break;

                        }
                    pom3=pom3->nast;
                }
               wypisz(pierwszy);

niestety nie działa poprawnie.
mógłby ktoś pomóc?

0

Twoje usuwanie z listy powinno wyglądać tak że zawsze patrzysz na następny element i wtedy porównujesz czy polskie następnego elementu jest równe żądanej wartości.
Jeżeli znalazłeś już element do usunięcia to musisz zapamiętać jaki jest następny aby przypisać go do obecnego. Wtedy możesz usunąć element i przypisać wskaźnik do zapamiętanego.

Tutaj kod z C/Typy złożone - Implementacja Listy:

void usun_z_listy(el_listy *lista, int element)
{
	el_listy *wsk=lista;
   	while (wsk->next != NULL)
   	{
		if (wsk->next->val == element) /* musimy mieć wskaźnik do elementu poprzedzającego */
		{
			el_listy *usuwany=wsk->next; /* zapamiętujemy usuwany element */
			wsk->next = usuwany->next;   /* przestawiamy wskaźnik next by omijał usuwany element */
			free(usuwany);               /* usuwamy z pamięci */
		} 
		else 
		{
			wsk = wsk->next;             /* idziemy dalej tylko wtedy kiedy nie usuwaliśmy */
		}                              /* bo nie chcemy zostawić duplikatów */
	}
 }
0

tylko to działa,
kompiluje się tylko wygląda to tak że nie usuwa do końca elementu.
pokażę na screenach.

tak jest przed usunięciem elementu(każdy element listy zaczyna się od słowa polskiego)(plik "przed").a tak po usunięciu elementu ze słowem "karton"(plik "po").
jak widać usunięto tylko polskie słowo.
Struktura listy:

struct element{
    char polskie[50];
    int ilosc_tlumaczen;
    char angielskie[T][50];
    struct element *nast;
};
0

Zauważ óżnicę:
U Ciebie:

usuwanie = pom3->nast;
pom3 = usuwanie->nast;
free(usuwanie);

A podanym przeze mnie kodzie

usuwany = wsk->next;
wsk->next = usuwany->next;  // Powinno być pom3->next
free(usuwany);
0

dzięki.
chciałbym lepiej to zrozumieć. dlaczego mój sposób był zły?
mógłbyś mi wytłumaczyć abym na przyszłość wiedział?
EDIT
Już rozumiem. rozpisałem sobie na kartce.
dzięki

0

Gdy usuwałeś element (pom3->nast) patrzyłeś jaki jest następny (usuwanie->nast == pom3->nast->nast) tak aby zapełnić dziurę, wtedy zamiast zmienić wskaźnik (pom3->nast) tak aby wskazywał na następny element zamieniałeś (pom3), który miał zostać.

W rezultacie element przed pom3 wskazywałby nadal na starą wersję pom3.

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