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);
}