Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    1

    funzioni liste C

    Ciao a tutti!
    Un esercizio di programmazione chiede di implementare due funzioni: la prima ricorsiva per eliminare certi elementi da una lista secondo una data condizione, la seconda iteritiva, sempre per eliminare altri elementi.
    Ho scritto questo codice ma mi dà due problemi:
    se devo eliminare il primo elemento va in segmentation fault e quando stampo, stampa solo l'ultimo elemento della lista.
    Riuscite a trovare dove sbaglio?
    codice:
    typedef struct partecipante {
       char nome;
       int laurea;
       int pubblicazioni;
       struct partecipante *next;
    } partecipante;
    
    void eliminacandidatiric (partecipante **lista){
        partecipante *aux;
    if (*lista!=NULL){if ((*lista)->laurea==0) {aux=*lista;
                                               *lista=(*lista)->next;
                                               free(aux);
                                                eliminacandidatiric(lista);}
                      else eliminacandidatiric(&((*lista)->next));}
    }
    
    void shortlist(partecipante **lista){
       partecipante *corr;
       partecipante *prec;
       partecipante *aux;
    if (*lista!=NULL) {while ((*lista)->pubblicazioni<3){aux=*lista;
                                                         *lista=(*lista)->next;
                                                         free(aux);}
                       if (*lista!=NULL){prec=*lista;
                                         corr=prec->next;
                                         while (corr!=NULL) {if (corr->pubblicazioni<3){prec->next=corr->next;
                                                                                        free(corr);
                                                                                        corr=prec->next;}
                                                             else {prec=prec->next;
                                                                   corr=corr->next;}
                                                             } 
                                          }
                       }
    }
    
    void stampa(partecipante *lista1){
       partecipante *aux;
    aux=lista1;
    while (aux!=NULL){printf("(%c,%d,%d) ",aux->nome, aux->laurea, aux->pubblicazioni);
                      aux=aux->next;}
    }
    
    partecipante * crealista(){
       char risp1;
       char risp2;
       partecipante *inizio;
       partecipante *aux;
    printf("La lista è vuota?\n");
    scanf(" %c", &risp1);
    if (risp1=='y') return NULL;
    else {inizio=malloc(sizeof(partecipante));
          printf("Inserisci il nome\n");
          scanf(" %c", &inizio->nome); 
          printf("E' laureato?\n");
          scanf("%d",&inizio->laurea);
          printf("Quanti testi ha pubblicato?\n");
          scanf("%d", &inizio->pubblicazioni);
          aux=inizio;}
    printf("Ci sono altri elementi? y or n?\n");
    scanf(" %c", &risp2);
    while (risp2!='n'){aux->next=malloc(sizeof(partecipante));
                       aux=aux->next;
                       printf("Inserisci il nome\n");
                       scanf(" %c", &inizio->nome); 
                       printf("E' laureato?\n");
                       scanf("%d",&inizio->laurea);
                       printf("Quanti testi ha pubblicato?\n");
                       scanf("%d", &inizio->pubblicazioni);
                       printf("Ci sono altri elementi? y or n?\n");
                       scanf(" %c", &risp2);}
    aux->next=NULL;
    return inizio;}

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    In questo post trovi una possibile soluzione di eliminazione in maniera ricorsiva di particolari elementi da una lista linkata (nell'esempio si tratta degli elementi con dato negativo, ma è facilmente adattabile). Passare per "riferimento" il puntatore alla testa della lista può incasinare un po' il tutto, è più semplice far restituire alla funzione il puntatore alla (eventualmente nuova) testa della lista.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.