Modificare campo in una lista

di Anonimizzato18300 il
24 risposte
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

  • 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.
  • 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.
  • "prelevazione" .... lettura ...

    Mostra il file dati ...
  • Gli elementi del file sono questi: 2 8 7 22 85
  • 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.
  • 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)
  • 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?
  • 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;
    }
  • Quasi ....

    somma=p->inf;
    if(p->next) somma += p->next->inf;
  • 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 . . .
  • Decisamente non leggi le risposte...
  • 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.
  • Ma nell'ultima risposta ti ho scritto le due righe di codice corrette... Non le hai lette...
  • Non mi stampava nulla per questo ho modificato il codice
Devi accedere o registrarti per scrivere nel forum
24 risposte