Modificare campo in una lista

di il
24 risposte

Modificare campo in una lista

Salve a tutti , sono alle prese con questo esercizio: "Definire una lista avente un campo intero e uno float. Inserire in testa gli interi presi da un file e inizializzare 0.0 il campo float. Con una funzione inserire nel campo float la media tra l'intero corrente e quello del nodo successivo".
Il mio problema sta nell'ultimo punto ovvero nel modificare il campo float. Potete spiegarmi cosa sbaglio?
Qui tutto il codice completo:
struct elemento{
 int inf;
 float inf2;
 struct elemento *next;
};
struct elemento *ins_testa(struct elemento *p);
void stampa(struct elemento *p);
struct elemento *media(struct elemento *p);

int main(){
struct elemento *p=NULL;

 p=ins_testa(p);
 stampa(p);
 p=media(p);
 stampa(p);

system("pause");
return 0;
}

struct elemento *ins_testa(struct elemento *p){
struct elemento *aus;
int num;
FILE *fp;

 fp=fopen("Interi.txt", "r");
  if(fp==NULL){
   perror("Errore in apertura da FILE!\n");
   exit(1);
  }
  while(fscanf(fp, "%d", &num)>0){
   aus=malloc(sizeof(struct elemento));
   aus->inf=num;
   aus->inf2=0.0;
   aus->next=p;
   p=aus;
  }
return p;
}

void stampa(struct elemento *p){

 if(p!=NULL){
  printf(" %d-%.1f -->", p->inf, p->inf2);
  stampa(p->next);
 }
 else{
  printf("NULL\n\n");
 }
}

struct elemento *media(struct elemento *p){
int somma=0;
float media=0.0;

 while(p!=NULL){
  somma=p->inf+p->next->inf;
  media=somma/2;
  p->inf2=media;
  p=p->next;
 }

return p;
}

24 Risposte

  • Re: Modificare campo in una lista

    Problema di che tipo?

    Come sempre ... devi descrivere il problema ... non è detto che si abbia voglia (o sia necessario) controllare tutto il codice ...

    Inoltre posta anche un file di prova.
  • Re: Modificare campo in una lista

    Nel momento in cui provo a stampare la lista, il programma mi dice che ha smesso di funzione come se la modifica del campo float creasse qualche problema nella stampa della nuova lista. infatti termina con la sola lettura da file e l'inizializzazione 0.0:

    85-0.0 --> 22-0.0 --> 7-0.0 --> 8-0.0 --> 2-0.0 -->NULL


    Process returned 255 (0xFF) execution time : 5.542 s
    Press any key to continue.
  • Re: Modificare campo in una lista

    "prelevazione" .... lettura ...

    Mostra il file dati ...
  • Re: Modificare campo in una lista

    Gli elementi del file sono questi: 2 8 7 22 85
  • Re: Modificare campo in una lista

    Nel calcolo della media dai per scontato che il prossimo puntatore sia valido, invece potrebbe essere NULL ... Devi controllare prima di utilizzare il corrispondente valore inf.

    E nel calcolo devi dividere per 2.0 per avere un risultato in virgola mobile.
  • Re: Modificare campo in una lista

    oregon ha scritto:


    Devi controllare prima di utilizzare il corrispondente valore inf.
    Non ho capito questa cosa. Nel while dovrei controllare se il nodo successivo è diverso da NULL, tipo così:
     while(p!=NULL && p->next!=NULL)
  • Re: Modificare campo in una lista

    Non nel while, ma solo quando fai l'addizione. Hai capito qual è il problema di cui parlo? Come calcoli la media dell'ultimo numero della lista?
  • Re: Modificare campo in una lista

    In questo modo?:
    struct elemento *media(struct elemento *p){
    int somma=0;
    float m=0.0;
    
     while(p!=NULL){
      if(p->next!=NULL){
       somma=p->inf+p->next->inf;
       m=somma/2.0;
       p->inf2=m;
       p=p->next;
      }
     }
    return p;
    }
  • Re: Modificare campo in una lista

    Quasi ....

    somma=p->inf;
    if(p->next) somma += p->next->inf;
  • Re: Modificare campo in una lista

    Sto decisamente impazzendo con questo esercizo . Se scrivo così:
    struct elemento *media(struct elemento *p){
    int somma;
    float m=0.0;
    
     while(p!=NULL){
      somma=p->inf;
      if(p->next!=NULL){
       somma=somma+p->next->inf;
       m=somma/2.0;
       p->inf2=m;
       return p;
      }
      p=p->next;
     }
    
    }
    mi restituisce in modo corretto solo il primo nodo tutti gli altri rimangono invariati
    85-0.0 --> 22-0.0 --> 7-0.0 --> 8-0.0 --> 2-0.0 -->NULL

    85-53.5 --> 22-0.0 --> 7-0.0 --> 8-0.0 --> 2-0.0 -->NULL

    Premere un tasto per continuare . . .
  • Re: Modificare campo in una lista

    Decisamente non leggi le risposte...
  • Re: Modificare campo in una lista

    Si che leggo le risposte, infatti quando mi viene spiegato il problema capisco subito dove devo correggere e arrivo a soluzione. Ma con le liste fatico molto a scrivere la soluzione corretta e questo esercizio ne è la testimonianza. Ho capito quale è il problema ma non riesco a scriverlo e quindi a far funzionare l'esercizio.
  • Re: Modificare campo in una lista

    Ma nell'ultima risposta ti ho scritto le due righe di codice corrette... Non le hai lette...
  • Re: Modificare campo in una lista

    Non mi stampava nulla per questo ho modificato il codice
Devi accedere o registrarti per scrivere nel forum
24 risposte