Usuwanie duplikatow z listy dwukierunkowej rekurencyjnie

0

Witam mam za zadanie napisać program, który usunie duplikaty elementów na liście dwukierunkowej. Udało mi się ten program napisać w wersji iteracyjnej jednak musze napisać jeszcze w wersji rekurencyjnej a z tym mam problem. Dotychczasowy kod:

void usunDR(lista *l)
{
	lista p,tmp;
    p=*l;
    if((*l)==0 && (*l)->nast==0 )
    	return;
    if((*l)->klucz==(*l)->nast->klucz)
        {
          tmp=(*l)->nast;
          (*l)->nast=(*l)->nast->nast;
          if(tmp->nast != 0)
          		(*l)->nast->pop=(*l);
          free(tmp);
        }
	usunDR((*l)->nast);
}
 

Jednakże program po uruchomieniu przestaje działać, co może byc przyczyną ? Dla porównania poniżej wersja iteracyjna.

 
void usunD (lista *l)
{
    lista p,tmp;
    p=*l;
    while(p!=0 && p->nast != 0)
    {
        if(p->klucz==p->nast->klucz)
        {
          tmp=p->nast;
          p->nast=p->nast->nast;
          if(tmp->nast != 0)
		  	p->nast->pop=p;
          free(tmp);
        }
        p=p->nast;
    }
}
1
void UsunElement(lista *l)
{
    lista b = *l;
    *l = b->nast;
    if (b->nas)
         b->nas->pop = b->pop;
    free(b);
}

void usunDuplikaty(lista *l)
{
    lista b, n; // bieżący, następny
    b=*l;

    if (b == 0 || b->nast == 0 ) // tu był zły warunek
        return;
    n = b->nast;

    if (b->klucz == n->klucz)
    {
        UsunElement(&b->nast);
        usunDuplikaty(l); // ta sama wartość więcej niż 2 razy pod rząd!
    } else {
        usunDuplikaty(&b->nast); // to jest rekurencja ogonowa, więc kompilator i tak zrobi z tego pętlę
    }
}

Zwróć uwagę, że twoja wersja iteracyjna ma błąd (podpowiedź wyżej).

0

Dzięki za świetne wytłumaczenie, teraz już pojmuje ;)

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