Memorizzare dati (int e char) in lista contenata in C

di il
7 risposte

Memorizzare dati (int e char) in lista contenata in C

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

7 Risposte

  • Re: Memorizzare dati (int e char) in lista contenata in C

    Ma perché devi memorizzare i caratteri : e , ?? Non ha alcun senso ... devi solo memorizzare i numeri ...
  • Re: Memorizzare dati (int e char) in lista contenata in C

    Va bene grazie, quindi se non devo memorizzare : e , come faccio a leggere i dati? Uso getchar?
  • Re: Memorizzare dati (int e char) in lista contenata in C

    La struttura con i dati che contiene è una cosa, come leggi i dati da tastiera è un'altra.

    Leggi i dati (sai usare la scanf?) e poi li memorizzi nelle varie strutture.

    Ma cosa rappresentano quei dati? Puoi spiegare? Ad esempio

    7:3,2,7,0

    ?
  • Re: Memorizzare dati (int e char) in lista contenata in C

    Sì, in pratica devo scrivere un programma che legga dallo standard input una sequenza di righe del tipo
    7: 3, 2, 7, 0
    1: 6, 7, 0
    3: 2, 7, 5, 0
    6: 1, 3, 0
    (ogni riga è terminata dal numero 0), le memorizzi in una struttura dati adeguata, e stampi il corrispondente indice inverso:
    3: 7, 6
    2: 7, 3
    7: 7, 1, 3
    6: 1
    5: 3
    1: 6

    Ma se uso scanf non posso leggere una sequenza di lunghezza indefinita di numeri e caratteri giusto? Quindi non dovrei usare getchar?
  • Re: Memorizzare dati (int e char) in lista contenata in C

    Puoi usare una struct di questo tipo
    
    #define MAX 20
    struct sport
    {
      int valore;
      int sequenza[MAX];
      int lunghezza;
      struct sport *next;
    };
    
    Prima di inserire la sequenza, devi chiedere all'utente quanto deve essere lunga. È il modo più semplice per tenere separati i dati dal modo di visualizzarli.
  • Re: Memorizzare dati (int e char) in lista contenata in C

    Va bene farò così, grazie mille per l'aiuto!
  • Re: Memorizzare dati (int e char) in lista contenata in C

    jackdeipilastri ha scritto:


    Sì, in pratica devo scrivere un programma che legga dallo standard input una sequenza di righe del tipo
    7: 3, 2, 7, 0
    1: 6, 7, 0
    3: 2, 7, 5, 0
    6: 1, 3, 0
    (ogni riga è terminata dal numero 0), le memorizzi in una struttura dati adeguata, e stampi il corrispondente indice inverso:
    3: 7, 6
    2: 7, 3
    7: 7, 1, 3
    6: 1
    5: 3
    1: 6
    Sinceramente non ho capito, cosa intendi con "stampi il corrispondente indice inverso"?

    Inoltre sarebbe utile capire il confine tra quella che è la traccia dell'esercizio e quella che invece è la tua interpretazione dello stesso.
Devi accedere o registrarti per scrivere nel forum
7 risposte