Liste

di Anonimizzato12372 il
27 risposte
Controllare se un numero di una lista si ripete k volte e inserirlo in una seconda lista.Ragazzi potete aiutarmi con questo codice.Grazie in anticipo
#include <stdio.h>
#include <stdlib.h>
 
struct elementi{
int x;
struct elementi *next;
};
 
struct elementi *crea(int x){
struct elementi *e=(struct elementi *)malloc(sizeof(struct elementi));
e->x=x;
e->next=NULL;
return e;
};
 
struct elementi *coda(struct elementi *top,int x){
if(top==NULL){
    struct elementi *e=crea(x);
    top=e;
}
else
    top->next=coda(top->next,x);
return top;
};
 
struct elementi *controllo(struct elementi *top,int k,struct elementi *top2){
    int c,volte=0;
    while(top!=NULL){                  //scorro la lista e assegno alla variabile c un valore di quest ultima                                                      
    c=top->x;                                            
for(;top!=NULL;top=top->next){               // col for controllo quante volte è presente questo valore
    if(c==top->x)
        volte++;
}
    if(volte==k){                          // se è presente un numero k di volte allora inserisco quel valore    
        top2=coda(top2,c);                              in una seconda lista
        volte=0;
    }
    top=top->next;                         // assegno a top l'elemento successivo.Il while ricomincia dinuovo
}                                            e cosi facendo i numeri presenti k volte li dovrebbe inserire      
return top2;                                 in una nuova lista
    }
 
 
void stampa(struct elementi *top){
if(top!=NULL){
    printf("il valore %d\n",top->x);
    stampa(top->next);
}
}
int main()
{
    int n;
    printf("inserisci la grandezza della lista\n");
    scanf("%d",&n);
    struct elementi *top=NULL;
    int i,m;
    for(i=0;i<n;i++){
        printf("inserisci il numero\n");
        scanf("%d",&m);
        top=coda(top,m);
    }
    printf("numero di ripetizioni?\n");
    int k;
    scanf("%d",&k);
    struct elementi *top2=NULL;
    top2=controllo(top,k,top2);
stampa(top2);
    return 0;
}

27 Risposte

  • Il problema specifico qual è? Devi fare una domanda precisa, non chiedere un "aiuto generico" ...
  • Il problema che riscontra il programma è in quella funzione controllo,purtroppo non so quale sia.La traccia del problema l'ho detta in pratica dovrei vedere quale numero si ripete un k di volte e inserirlo in una seconda lista
  • La traccia di un problema non basta in un forum. Qui almeno non si fornisce la "soluzione completa" (non si fanno gli esercizi per gli altri) ma si spiegano eventuali problemi e si risolvono insieme.

    Adesso, qual è esattamente il problema e in quale parte del codice? L'hai scritto tu il codice? Saprai spiegare cosa hai fatto e cosa non va ...
  • Sisi l'ho scritto io il codice e infatti non ti sto chiedendo di farmi l'esercizio , ma semplicemente volevo sapere se voi riuscivate ad individuare l'errore.Ho anche scritto che l'errore sta in quel while della funzione controllo.Il programma viene compilato ed eseguito, ma ad un certo punto si blocca e termina
  • antonx ha scritto:


    sisi l'ho scritto io il codice e infatti non ti sto chiedendo di farmi l'esercizio , ma semplicemente volevo sapere se voi riuscivate ad individuare l'errore.Ho anche scritto che l'errore sta in quel while della funzione controllo.Il programma viene compilato ed eseguito, ma ad un certo punto si blocca e termina
    Scusa, ma lo stai dicendo solo adesso che il problema è nel while e che il programma si blocca.
  • Va bene comunque non fa niente ,senti mica riesci ad individuare l'errore perfavore?perchè io davvero non capisco dove ho sbagliato
  • Penso sia proprio a causa del fatto che ti muovi attraverso la lista sia con il while che con il for.

    La for ti porta alla fine della lista e quando cicli con la while sei già alla fine.
  • Quindi in pratica dovrei mettere al posto del while un for mantenendo le operazioni successive?
  • Perché cambiare while con for? Non ti ho detto questo ... Semplicemente devi usare due puntatori.
  • Ah scusami non avevo capito.In pratica la mia idea iniziale era quella che col while mi prendevo un elemento della lista,e nel for invece, facevo controllare questo elemento con ogni singolo componente della lista.Però non ho capito ora come dovrei agire
  • Con due puntatori, uno per la while e uno per la for ... te l'ho scritto poco fa ...
  • Si ma non ho capito cosa dovrebbero fare questi due puntatori
  • Hai capito che se usi top sia nel while che nella for hai problemi? Quindi nella for usa un altro puntatore alla lista per scorrerla in modo che il puntatore top possa essere usato nella while.
  • Ho capito,grazie tante
Devi accedere o registrarti per scrivere nel forum
27 risposte