Eliminare elemento da una lista ricorsivo

di il
1 risposte

Eliminare elemento da una lista ricorsivo

Salve a tutti ragazzi! avrei bisogno di un aiuto, siccome nessuno mi ha mai spiegato i doppi puntatori e quando ho eliminato qualcosa da una lista mi sono sempre fatto ritornare la lista.Mi potreste aiutare perfavore?
ecco il mio codice

void esercitazione (struct elemento **top,struct elemento **top2){
printf("quale elemento vuoi cancellare?\n");
int n;
scanf("%d",&n);
if(*top!=NULL && *top2 !=NULL){
eliminalo(top,n);
eliminalo(top2,n);
}
else
    return;
}

void eliminalo(struct elemento **top,int n){
    struct elemento *e=NULL;
if(*top!=NULL){
    if((*top)->x==n){
        if((*top)->prec==NULL){
                e=(*top);
	            (*top)=((*top)->next);
	            (*top)->prec=NULL;
	            free (e);
            }
             else if((*top)->next==NULL){
                e=(*top)->prec;
                free(*top);
                e->next=NULL;
                *top=e;
             }
              else{
                 e=*top;
                 (*top)->prec->next=(*top)->next;
                 (*top)->next->prec=(*top)->prec;
                 (*top)=(*top)->next;
                  free(e);
             }
}
 eliminalo(&((*top)->next),n);
}
else
return;
}


int main()
{
    struct elemento *top=NULL;
    struct elemento *top2=NULL;
    printf("quanti elementi vuoi inserire nella prima lista?\n");
    int n,i,x,m;
    scanf("%d",&n);
    for(i=0;i<n;i++){
       scanf("%d",&x);
       insordine(&top,x);
    }
    printf("quanti elementi vuoi inserire nella seconda lista?\n");
    scanf("%d",&m);
    for(i=0;i<m;i++){
       scanf("%d",&x);
       insordine(&top2,x);
    }
    //top=pre_prova(top,top2);
    esercitazione(&top,&top2);
    printf("\n\n\n");
    stampa(top);
    printf("\n\n\n");
    stampa(top2);
    return 0;
}

ora vi spiego il problema che mi da il codice: metto i valore 1 2 3 4 5 nelle due liste
se voglio eliminare 1 tutto apposto
se voglio eliminare 2 mi elimina anche il 3
se voglio eliminare 3 elimina anche il 4
se voglio eliminare il 4 si blocca
se voglio eliminare il 5 si blocca

1 Risposte

  • Re: Eliminare elemento da una lista ricorsivo

    
    void eliminalo(struct elemento **top,int n){
       struct elemento *e=NULL;
       if(*top!=NULL){
          if((*top)->x==n){
             if((*top)->prec==NULL && (*top)->next==NULL){
                *top=NULL;
                 return;
              }
              if((*top)->prec==NULL){
                 e=(*top);
                (*top)=(*top)->next;
                (*top)->prec=NULL;
                 free (e);
              }
              else if((*top)->next==NULL){
                 e=*top;
                 *top=(*top)->prec;
                (*top)->next=NULL;
                free(e);
              }
              else if((*top)->next!=NULL && (*top)->prec!=NULL){
                  e=*top;
                  e->prec->next=e->next;
                  e->next->prec=e->prec;
                  free(e);
             }
          }
         if((*top)->next!=NULL)
            eliminalo(&((*top)->next),n);
      }
    return;
    }
    
    ho aggiustato un po il codice in questo modo ma non mi cancella tutte le occorrenze
Devi accedere o registrarti per scrivere nel forum
1 risposte