Rekurencyjne usuwanie powtarzających się elementów z listy

0

Witam, mam problem z funkcją, która rekurencyjnie usunie powtarzające się elementy na liście. Działa ona prawie poprawnie, lecz nie usuwa pierwszego elementu na liście. Gdzie może leżeć przyczyna ?

 void usunpowR(lista *l, int n)
{
	if((*l)==0)
		return;
	if((*l)->nast && (*l)->klucz == n)
	{
		UPEL(l);
	}
	usunpowR(&(*l)->nast, n);
}
0

Podejrzewam, że skoro wszędzie odwołujesz się do następnego elementu, to pierwszego nigdy nie znajdzie.
Jak działa UPEL()?

0

@fryderykst
UPEL() usuwa pierwszy element listy.

 void UPEL(lista *l)
{
	lista tmp;
	tmp=*l;
	*l=(*l)->nast;
	free (tmp);
}
0

Ustaw Breakpoint w środku funkcji UPEL() i zobaczysz czy w ogóle jest ona uruchamiana.

To wszystko w ogóle Ci działa? Można tak robić?

 (*l)->nast

Nie powinno być tak?

 l->nast

ew tak?

 (*l).nast
0

Ustawiłem breakpointa i funkcja jest uruchamiana o 1 raz za mało (nie dla pierwszego elementu).

0
  if((*l)->nast && (*l)->klucz == n)

sprawdzasz czy l->nast istnieje i czy l->klucz jest równy n.
Jeśli został CI tylko jeden element listy, to l->nast nie będzie istniał i funkcja się nie wykona.

0

Po zmianie warunku na:

  if((*l) && (*l)->klucz == n)

funkcja wciąż działa tak samo.

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