Liste Autoreferenziali (Gestione targhe)

di il
8 risposte

Liste Autoreferenziali (Gestione targhe)

Salve a tutti, apro questo topic per potervi segnalare un problema al quale non trovo soluzione.
La richiesta dell'esercizio è la creazione di una lista (ricorsiva) che riesca a gestire un numero 'x' di targhe inserite durante il processo di creazione e stamparle eventualmente su schermo.
Purtroppo gli errori che ho riscontrato sono tutti a tempo di esecuzione e non saprei quindi proprio cosa fare; vi posto qui sotto il codice sperando in un aiuto.
Grazie in anticipo.
#include <string.h>
/*definizione struttura targhe*/
typedef struct targa{
  int info;
  struct targa *next;
}targa;
typedef struct targa *targhe;
targhe addtargacoda(targhe, int);
void stampatarga(targhe);

/*operazioni su targa*/
targhe addtargacoda(targhe a,int c){ //sto passando come parametro un puntatore di un puntatore che punta a una struttura?
  char e;
  int g;
  targhe b = malloc(sizeof(targa));
  b->info=c;
  b->next=NULL;
  if(b==NULL){
    a=b;
  }
  else {
    targhe f = malloc(sizeof(targa));
    f=a;
    while(f!=NULL){
    f=f->next;
    }
    f->next=b;
  }
  printf("AZIONI:\n");
  printf("Scrivi Una targa:\n");
  printf("Premi A per aggiungere una targa\n");
  printf("Premi S per stampare le targhe\n");
  if ('a'==getchar()){
    printf("Scrivi la targa che vuoi aggiungere\n");
    scanf("%d","&g");
    addtargacoda(a, g);
  }
  if ('s'==getchar()){
    stampatarga(a);
  }
  return a;
}
void stampatarga(targhe a) {
  int h;
  if (a!=NULL){
    printf ("-- %d\n", a->info);
    stampatarga(a->next);
  }
  printf("AZIONI:\n");
  printf("Scrivi Una targa:\n");
  printf("Premi A per aggiungere una targa\n");
  if ('a'==getchar()){
    printf("Scrivi la targa che vuoi aggiungere\n");
    scanf("%d","&h");
    addtargacoda(a ,h);
  }
}

#include <stdlib.h>
#include "targhe.h"
#include <stdio.h>
#include <string.h>
#include <stddef.h>
/*GESTIONE TARGHE v. 1.0*/
int main(int argc, char *argv[]){
  char c,s;
  int d;
  targhe a;
  targa b;
  printf("Scrivi Una targa:\n");
  scanf("%d","&d");
  b.info = d;
  b.next = NULL;
  a=&b;
  printf("AZIONI:\n");
  printf("Premi A per aggiungere una targa\n");
  printf("Premi S per stampare la lista di targhe\n");
  if ('a'==getchar()){
    printf("Scrivi la targa che vuoi aggiungere\n");
    scanf("%d","&e");
    addtargacoda(a ,d);
  }
  if ('s'==getchar()){
    stampatarga(a);
  }
  system("PAUSE");	
  return 0;
}

8 Risposte

  • Re: Liste Autoreferenziali (Gestione targhe)

    Cominciamo a correggere gi errori di sintassi, le scanf vanno scritte così:

    scanf("%d", &d);

    e non così:

    scanf("%d", "&d");

    Poi spiega per favore che cosa dovrebbe fare di preciso questo codice.
  • Re: Liste Autoreferenziali (Gestione targhe)

    Intanto ti ringrazio per la tua disponibilità SVNiko; Scanf a parte (che correggerò non appena possibile e delle quali ti ringrazio di avermi fatto notare) , e che spero non pregiudichino enormemente l'esecuzione del codice, quello che il programma dovrebbe fare è costruire una lista ricorsiva di targhe, con la quale possa lavorare sopra, e quindi aggiungere e stampare eventuali targhe che decida di inserire durante l'esecuzione. Spero di essere stato il più chiaro possibile.
  • Re: Liste Autoreferenziali (Gestione targhe)

    Per fare un algoritmo ricorsivo nell'inserimento, dovresti inserire in coda alla lista e, la funzione di add dovresti scriverla così:
    
    if(nodopassato==NULL)
        inserisci e ritorna
    ricorri(prossimonodo);
    
    Per la stampa ricorsiva, potresti scrivere:
    
    if(ultimonodo)
       ritorna
    stampa nodo corrente;
    ricorri(prossimonodo);
    
  • Re: Liste Autoreferenziali (Gestione targhe)

    Per fare un algoritmo ricorsivo nell'inserimento, dovresti inserire in coda alla lista e, la funzione di add dovresti scriverla così:

    CODICE: SELEZIONA TUTTO
    if(nodopassato==NULL)
    inserisci e ritorna
    ricorri(prossimonodo);


    Per la stampa ricorsiva, potresti scrivere:
    CODICE: SELEZIONA TUTTO
    if(ultimonodo)
    ritorna
    stampa nodo corrente;
    ricorri(prossimonodo);
    Ho preso il tuo consiglio alla lettera e ho provato a lanciarlo nuovamente così:
    #include <stdlib.h>
    #include "targhe.h"
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>
    /*GESTIONE TARGHE v. 1.0*/
    int main(int argc, char *argv[]){
      char c,s;
      int d;
      targhe a = malloc (sizeof(struct targa));;
      printf("GESTIONE TARGHE ver. 1.0\n");
      printf("Scrivi Una targa:\n");
      scanf("%d", &d);
      a->info = d;
      a->next = NULL;
      printf("AZIONI:\n");
      printf("Premi A per aggiungere una targa\n");
      printf("Premi S per stampare la lista di targhe\n");
      if ('a'==getchar()){
        printf("Scrivi la targa che vuoi aggiungere\n");
        scanf("%d", &d);
        addtargacoda(a ,d);
      }
      if ('s'==getchar()){
        stampatarga(a);
      }
      system("PAUSE");	
      return 0;
    }
    
    #include <stdio.h>
    #include "targhe.h"
    #include <stddef.h>
    targhe *addtargacoda(targhe, int);
    void stampatarga(targhe);
    struct targa *talloc(void);
    /*allocatore di memoria per eventuali nodi*/
    struct targa *talloc(void) {
     	return malloc (sizeof(struct targa));
     }
    /*operazioni su targa*/
    targhe *addtargacoda(targhe a,int c){
      char e;
      int g;
      if(a==NULL){
        targhe a = talloc();
        a->info = c;
        a->next = NULL;
      }
      else {
        addtargacoda(a->next,c);
      }
      printf("AZIONI:\n");
      printf("Premi A per aggiungere una targa\n");
      printf("Premi S per stampare le targhe\n");
      if ('a'==getchar()){
        printf("Scrivi la targa che vuoi aggiungere\n");
        scanf("%d", &g);
        addtargacoda(a, g);
      }
      if ('s'==getchar()){
        stampatarga(a);
      }
      return a;
    }
    void stampatarga(targhe a) {
      int h;
      if ( a != NULL ) {
        printf("%d\n", a->info);
        stampatarga(a->next);
      }
      printf("AZIONI:\n");
      printf("Premi A per aggiungere una targa\n");
      if ('a'==getchar()){
        printf("Scrivi la targa che vuoi aggiungere\n");
        scanf("%d", &h);
        addtargacoda(a ,h);
      }	
    }
    
    #include <string.h>
    /*definizione struttura targhe*/
    typedef struct targa{
      int info;
      struct targa *next;
    }targa;
    typedef struct targa *targhe;
    
    Sembra partire facendomi inserire la prima targa e anche l'operazione di stampa sembra funzionare abbastanza bene se non per qualche problema di forma in merito alle linee di testo;
    il grosso problema rimane la funzione di aggiunta targhe "addtargacoda()" che mi arresta l'esecuzione subito dopo la prima chiamata.. hai qualche consiglio?
  • Re: Liste Autoreferenziali (Gestione targhe)

    Il problema sta nelle funzioni ricorsive, non sono corrette.
    
    void addtargacoda(targhe a, int c) {
    
        if(a->next == NULL) {
            a->next = talloc();
            a->next->info = c;
            a->next->next = NULL;
            return ;
        }
        addtargacoda(a->next, c);
    }
    
    void stampatarga(targhe a) {
    
        if (a == NULL)
            return;
    
        printf("%d\n", a->info);
        stampatarga(a->next);
    }
    
  • Re: Liste Autoreferenziali (Gestione targhe)

    Ho riscritto le funzioni come come consigliato ma il problema permane..
    /*operazioni su targa*/
    targhe *addtargacoda(targhe a,int c){
      char e;
      int g;
      if(a->next==NULL){
        a->next = talloc();
        a->next->info = c;
        a->next->next = NULL;
        printf("AZIONI:\n");
        printf("Premi A per aggiungere una targa\n");
        printf("Premi S per stampare le targhe\n");
        if ('a'==getchar()){
          printf("Scrivi la targa che vuoi aggiungere\n");
          scanf("%d", &g);
          addtargacoda(a, g);
        }
        if ('s'==getchar()){
          stampatarga(a);
        }
        return;
      }
      else {
        addtargacoda(a->next,c);
      }
    }
    void stampatarga(targhe a) {
      int h;
      if ( a == NULL ) {
        return;
        }
        printf("%d\n", a->info);
        stampatarga(a->next);
      printf("AZIONI:\n");
      printf("Premi A per aggiungere una targa\n");
      if ('a'==getchar()){
        printf("Scrivi la targa che vuoi aggiungere\n");
        scanf("%d", &h);
        addtargacoda(a ,h);
      }	
    }
    Non penso che mi rimanga altro da fare che accantonarlo per un pò e ristudiare un pò di teoria, Non sapendo proprio dove mettere le mani.
  • Re: Liste Autoreferenziali (Gestione targhe)

    A me funziona! Commetti l'errore di voler scrivere il menu all'interno della funzione ricorsiva, separa le cose, se proprio vuoi che sia la libreria a scrivere il menu metti una funzione che fa quello.

    main.c
    
    #include <stdlib.h>
    #include <stdio.h>
    #include "targhe.h"
    
    
    /*GESTIONE TARGHE v. 1.0*/
    int main(int argc, char *argv[]) {
    
        int d;
        char c;
        int esci=1;
        targhe a = malloc (sizeof(struct targa));
        if(a==NULL) {
            printf("Errore allocazione!\n");
            exit(-1);
        }
        printf("GESTIONE TARGHE ver. 1.0\n");
    
        printf("Scrivi Una targa:\n");
        scanf("%d%*c", &d);
    
        a->info = d;
        a->next = NULL;
    
        do {
            printf("AZIONI:\n");
            printf("Premi A per aggiungere una targa\n");
            printf("Premi S per stampare la lista di targhe\n");
            printf("Premi E per uscire\n");
            scanf("%c%*c",&c);
    
            if (c=='a' || c=='A') {
                printf("Scrivi la targa che vuoi aggiungere\n");
                scanf("%d%*c", &d);
                addtargacoda(a ,d);
            }
            if (c=='s' || c=='S')
                stampatarga(a);
    
            if(c=='e' || c=='E')
                esci=0;
    
        } while(esci);
    
        system("PAUSE");
        return 0;
    }
    
    
    targhe.h
    
    #ifndef TARGHE_H_INCLUDED
    #define TARGHE_H_INCLUDED
    
    /*definizione struttura targhe*/
    typedef struct targa {
        int info;
        struct targa *next;
    } targa;
    
    typedef struct targa *targhe;
    
    void addtargacoda(targhe, int);
    void stampatarga(targhe);
    struct targa * talloc(void);
    
    #endif // TARGHE_H_INCLUDED
    
    targhe.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "targhe.h"
    
    
    /*allocatore di memoria per eventuali nodi*/
    struct targa *talloc(void) {
    
        targhe t = malloc (sizeof(struct targa));
        if(t==NULL) {
            printf("Errore allocazione!\n");
            exit(-1);
        }
        return t;
    }
    
    /*operazioni su targa*/
    void addtargacoda(targhe a, int c) {
    
        if(a->next == NULL) {
            a->next = talloc();
            a->next->info = c;
            a->next->next = NULL;
            return ;
        }
        addtargacoda(a->next, c);
    }
    
    void stampatarga(targhe a) {
    
        if (a == NULL) {
            printf("\n");
            return;
        }
        {/*Stampa risultato ben formattato */
            printf("%d", a->info);
            if(a->next!=NULL)
                printf("->");
        }
        stampatarga(a->next);
    }
    
  • Re: Liste Autoreferenziali (Gestione targhe)

    Non sò proprio come ringraziarti, Sei stato esaustivo e disponibile;
    Finalmente ho un campione da consultare in caso di futuri esercizi che abbiano una richiesta analoga a questa. Grazie Mille.. veramente!
Devi accedere o registrarti per scrivere nel forum
8 risposte