Buonasera a tutti,
devo scrivere un programma che legga da standard input una sequenza di righe del tipo
7:3,2,7,0
1:6,7,0
...
terminate dal numero 0, e memorizzarle in un'opportuna struttura dati. Io avevo pensato di memorizzarle in una lista concatenata, ma non so come trattare i caratteri ' : ' e ' , ' . Ho provato a definire come argomenti della lista anche due caratteri char per memorizzare ' : ' e ' , ' ma così il programma mi fa inserire solo 2 righe (invece che 4 come ho stabilito), e mi stampa correttamente solo la prima riga. Non riesco a capire dove sia l'errore, e non so neanche se questo metodo sia corretto... Grazie mille in anticipo a chi mi risponderà.
#include <stdio.h>
#include <stdlib.h>
// Definisco numero di righe da inserire
#define N_righe 4
/*
Utilizzo una lista concatenata per memorizzare gli sport.
La struttura "sport" rappresenta gli elementi di questa lista.
Ogni elemento ha 2 campi:
- "valore", che rappresenta lo sport
- "next", che è un puntatore alla successiva misura della lista
*/
struct sport
{
int valore;
char virgola;
struct sport *next;
};
/*
La struttura "codice" memorizza le informazioni di una riga:
- "nome", che rappresenta il nome
- "testa_sport", che punta al primo elemento della lista di sport
*/
struct codice
{
int nome;
char due_punti;
struct sport * testa_sport;
};
/*
Questa funzione serve ad inserire un nuovo elemento nella lista degi sport.
Ha 2 argomenti:
- "testa_sport", che e' il puntatore alla lista di sport in cui verra' fatto l'inserimento del nuovo sport
- "valore", che rappresenta il nuovo sport che devo inserire
In questo caso viene effettuato un inserimento in testa alla lista degli sport.
*/
struct sport * inseriscisport (struct sport * testa_sport, int valore, char virgola)
{
// 1) Creo il nuovo elemento sport
struct sport * new_sport = NULL;
new_sport = (struct sport *) malloc(sizeof(struct sport));
if(new_sport == NULL)
exit(EXIT_FAILURE);
// 2) Inizializzo i suoi campi
new_sport->valore = valore;
new_sport->virgola = virgola;
// 3) Lo faccio puntare al primo elemento della lista di sport
new_sport->next = testa_sport;
// 4) Restituisco l'indirizzo del nuovo elemento che sara' la nuova testa della lista
return new_sport;
}
/*
Funzione che legge i dati dallo standard input e li memorizza nella struttura dati passata come argomento alla funzione.
*/
void leggidati (struct codice codici[])
{
int valore;
char virgola;
int nome;
char due_punti;
// Mi aspetto di leggere N_righe
for(int i = 0; i < N_righe; i++)
{
// Leggo il codice della riga 'i'
scanf(" %d %c ", &nome, &due_punti);
// Inizializzo la riga 'i'
codici[i].nome = nome;
codici[i].due_punti = due_punti;
codici[i].testa_sport = NULL;
// Leggo lo sport
scanf(" %d %c ", &valore, &virgola);
// Finchè lo sport e' diversa da zero...
while(valore != 0)
{
// ...lo inserisco nella lista degli sport della riga 'i'
codici[i].testa_sport = inseriscisport(codici[i].testa_sport, valore, virgola);
// A questo punto leggo la successiva misura
scanf(" %d %c ", &valore, &virgola);
}
}
}
/*
Funzione di stampa
*/
void stampa(struct codice codici[])
{
printf("\n");
// Per ogni riga nel vettore...
for(int i = 0; i < N_righe; i++)
{
printf(" %d %c ", codici[i].nome, codici[i].due_punti);
// ...scorro la lista dei suoi sport...
struct sport * ptr_sport = codici[i].testa_sport;
while(ptr_sport != NULL)
{
// ...e li stampo
printf(" %d %c ", ptr_sport->valore, ptr_sport->virgola);
ptr_sport = ptr_sport->next;
}
printf("\n");
}
}
int main()
{
// Creo un vettore di oggetti "struct codice" di dimensione N_righe
struct codice codici[N_righe];
// Leggo i dati e li memorizzo nella struttura dati
leggidati(codici);
// Stampo il contenuto della struttura dati per verificare che sia corretto
stampa(codici);
exit(EXIT_SUCCESS);
}