Sommare elementi uguali in una lista in C

di il
1 risposte

Sommare elementi uguali in una lista in C

Buonasera a tutti,
devo scrivere una lista per memorizzare una serie di dati del tipo
A 50
B 21
H 12
B 15
...
X
dove la X indica la fine dei dati. Devo poi sommare i dati contrassegnati dalla stessa lettera e inserire il risultato nella lista. Ho provato a scrivere una funzione "somma", ma non riesco a farla funzionare (mi dà errore di segmentazione). Qualcuno sa indicarmi dove sbaglio? Grazie in anticipo.

#include <stdio.h>
#include <stdlib.h>

struct risorsa
{
  char lettera;
  int valore;
  struct risorsa *prox;
};
struct risorsa *testa = NULL;

// Funzione che aggiunge un elemento in testa alla lista e restituisce la nuova testa della lista
struct risorsa * aggInTesta (struct risorsa * testa, char lettera, int valore) 
{
  struct risorsa * nuovaTesta;
  nuovaTesta = (struct risorsa *) malloc(sizeof(struct risorsa));
  
  if(nuovaTesta == NULL) 
     return NULL;
  
  nuovaTesta->lettera = lettera;
  nuovaTesta->valore = valore;
  nuovaTesta->prox = NULL;
  
  if(testa != NULL) 
  {
     nuovaTesta->prox = testa;
  }

  return nuovaTesta;
}

// Funzione per stampare gli elementi della lista
void stampa_lista (struct risorsa *testa)
{
  while(testa != NULL) 
  {    
     printf("%c %d\n", testa->lettera, testa->valore);  
     testa = testa->prox;       
  }

  printf("\n");   

  return;
}

// Funzione per trovare la somma di elementi caratterizzati dalla stessa lettera nella lista
struct risorsa * somma (struct risorsa *cursore)
{
  int somma = 0;
  struct risorsa *ptr = NULL;

  while(cursore != NULL) 
  {
     ptr = cursore->prox;
     while(ptr != NULL)
     {
        if(cursore->lettera == ptr->lettera)
           somma = cursore->valore + ptr->valore;

        ptr = ptr->prox;
    }

     cursore = cursore->prox;
  }

  cursore = aggInTesta(cursore, cursore->lettera, somma);

  return cursore;
}


int main ()
{
  char lett;
  int misura;

  struct risorsa *testa1 = NULL;

  // Leggo la prima riga
  scanf(" %c %d", &lett, &misura);
  
  // Finché la lettera inserita è diversa da X...
  while(lett != 'X')
  {         
     testa1 = aggInTesta(testa1, lett, misura);

     if(testa1 == NULL) 
        exit(EXIT_FAILURE);
   
     scanf(" %c %d", &lett, &misura);
     
      testa1 = somma(testa1);
  }

  // Stampo la lista creata
  stampa_lista(testa1);

  
  exit(EXIT_SUCCESS);
}

1 Risposte

  • Re: Sommare elementi uguali in una lista in C

    Nella funzione 'somma' esci dal while più esterno quando 'cursore' è NULL, ma poi fai:
    cursore = aggInTesta(cursore, cursore->lettera, somma);
    il che porta ovviamente alla segfault.
Devi accedere o registrarti per scrivere nel forum
1 risposte