Alberi ABR

di il
14 risposte

Alberi ABR

Salve sono nuovo del gruppo vorrei andare subito al dunque avrei bisogno di una mano per quanto riguarda un esercizio in c, argomento alberi ABR. La traccia del mio esercizio mi chiede questo "Si progetti un programma per la gestione di una biblioteca per studenti.Gli attori principali sono: 1 la biblioteca(un insieme di libri 5 libri identificativi da un titolo univoco. 2 gli studenti identificati da una matricola univoca, ogni studente potrà prendere in prestito un libro o restituirlo. Siccome sono un argomento che ho trattato poco gli alberi vorrei avere almeno uno schema generale su come impostare il programma. Grazie in anticipo

14 Risposte

  • Re: Alberi ABR

    Visto che sei nuovo del gruppo e non avrai ancora letto il regolamento, ti darò qualche breve indicazione ...

    Qui non si fanno ordinazioni ...

    No si scrive codice degli esercizi al posto tuo ...

    Non si fanno schemi ...

    Tu mostri il tuo codice e i tuoi dubbi/errori e se ne discute.
  • Re: Alberi ABR

    Non era minimamente mia intenzione voler essere svolto l'esercizio anzi volevo un aiuto per quanto riguarda l'approccio all esercizio e di conseguenza un eventuale tipo di implementazione del albero. Ho letto il regolamento.
  • Re: Alberi ABR

    Non puoi fare un discorso generico. Hai studiato l'argomento? Cosa non sai fare? Questo

    https://it.wikipedia.org/wiki/Albero_binario_di_ricerc

    sarebbe inizialmente utile a toglierti qualche dubbio?
  • Re: Alberi ABR

    Ho scritto qualche riga di codice, qui ho cercato di popolare e nominare i nodi dell albero, con i nomi presi da un file, mi da segmentation fault perche HELP ME.

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



    typedef struct nodo{
    char titolo;
    struct nodo *sx;
    struct nodo *dx;
    }libro;


    libro * alloca(char c){
    libro *l;
    l=(libro *)malloc(sizeof(libro)); //alloca in memoria un nodo
    l->titolo=c;
    l->sx=NULL;
    l->dx=NULL;
    return l;
    }

    libro *inserisci(libro *l, char c){
    // printf("\n%s",c);
    if(!l){ //se il puntatore e diverso da null
    l=alloca(c);
    }
    else{if(l->titolo<c){
    l->dx=inserisci(l->dx,c);
    }else{
    l->sx=inserisci(l->sx,c);

    }}

    return l;
    }

    void ordinamento(libro *l){
    if(l){
    printf("\n%s",l->titolo);
    ordinamento(l->sx);
    ordinamento(l->dx);
    }
    }



    int main() {

    FILE *fd;
    char buf[200];
    char *res;
    int i;
    libro *l;

    l=NULL;


    fd=fopen("testi.txt", "r"); //apertura file
    if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
    }


    while(1) {
    res=fgets(buf, 200, fd);/* legge fino allo /n*/
    if( res==NULL )
    break;
    printf("%s", buf);
    }


    for(i=0;i<strlen(buf);i++){ //inserisco i libri nell albero con funzione inserisci
    l=inserisci(l,buf);

    ordinamento(l);

    }


    /* chiude il file */
    fclose(fd);

    return 0;
    }

    for(i=0;i<strlen(buf);i++){ //inserisco i libri nell albero con funzione inserisci
    l=inserisci(l,buf);



    }


    /* chiude il file */
    fclose(fd);

    return 0;
    }
  • Re: Alberi ABR

    Usa i tag CODE altrimenti non si capisce. Guardando di sfuggita il codice, mi sembra che tu non sappia la differenza tra array di caratteri e caratteri, e come si confrontano in C gli array di caratteri.
  • Re: Alberi ABR

    ERRORE DI SEGMENTATION FAULT
    
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<malloc.h>
    
    
    
    typedef struct nodo{
     char* titolo;
     struct nodo *sx;
     struct nodo *dx;
    }libro;
    
    libro* inserisci(libro *l, char* c){
    
        if( l == NULL){ //inserisco e ritorno il mio indirizzo al nodo che ha richiamato la funzione
    
            libro* nuovoNodo = (libro*) malloc(sizeof(libro));// creo il nuovo nodo
            l->sx = nuovoNodo; //collego il nuovo nodo all'albero
            nuovoNodo->titolo = c; //il titolo del nodo punta alla stringa alla quale punta anche c, non deallocare attraverso c altrimenti perdi la stringa
            nuovoNodo->sx = NULL;
            nuovoNodo->dx = NULL;
    
            return nuovoNodo;
    
        }else{
    
        printf("\n %s",c);
        if(strcmp(l->titolo,c) == 0){ // provo a inserire lo stesso libro due volte, cosa non contemplata
    
            return l;
        }
        else if( strcmp(l->titolo,c) > 0 ){
    
                l->sx=inserisci(l->sx,c);
    
    
        }else{
                l->dx=inserisci(l->dx,c);
    
        }}
    
    return l;
    }
    
    void ordinamento(libro *l){
            if(l){
            printf("\n%s",l->titolo);
            ordinamento(l->sx);
            ordinamento(l->dx);
            }
    }
    
    
    
    int main() {
    
    FILE *fd;
    char buf[200];
    char *res;
    int i;
    libro *l = (libro*) malloc(sizeof(libro));
    l->titolo = (char*) malloc(sizeof(char)*6);//titolo di prova
    sprintf(l->titolo,"prova");
    l->sx = NULL;
    l->dx = NULL;
    
    l=NULL;
    
    
      fd=fopen("testi.txt", "r"); //apertura file
      if( fd==NULL ) {
        perror("Errore in apertura del file");
        exit(1);
      }
    
    
      while(1) {
        res=fgets(buf, 200, fd);/* legge fino allo /n*/
        if( res==NULL )
          break;
        //printf("%s", res);
    
               }
    
    
    
      for(i=0;i<strlen(buf);i++){    //inserisco i libri nell albero con funzione inserisci
    
         inserisci(l,buf);
    
           //ordinamento(l);
    
      }
    
    
      /* chiude il file */
      fclose(fd);
    
      return 0;
    }
    
  • Re: Alberi ABR

    Vai in editing del tuo post; seleziona "editor completo ed anteprima"; compariranno una serie di pulsanti: cerca quello del 'codice'; ti inserirà all'inizio (od alla fine, dipende da dove sarà il cursore), una coppia di tag (come in html, uno di apertura ed uno di chiusura). Quello di apertura lo metti all'inizio del codice, quello di chiusura lo metti alla fine, premi "Anteprima", vedi com'è e se c'è qualcosa da aggiustare, ed alla fine premi "invio".
  • Re: Alberi ABR

    Ho modificato l'ultimo codice come lei mi ha chiesto, per non inserirne un altro
  • Re: Alberi ABR

    for (i = 0; i < strlen(buf); i++){    //inserisco i libri nell'albero con funzione inserisci
    
         inserisci(l, buf);
    }
    Mi spieghi a che cosa serve questo? Cosa c'è o pensi che ci sia in buf ?
  • Re: Alberi ABR

    Nel while in buf metto parola per parola, pero adesso sto notando che nel for il buf e carico di di tutte le parole, quindi adesso sto pensando di inserire quel inserisci(l,buf) nel while prima di if(res==NULL) ed eliminare il for
  • Re: Alberi ABR

    libro* inserisci(libro *l, char* c) {
    
        if (l == NULL)  //inserisco e ritorno il mio indirizzo al nodo che ha richiamato la funzione
        {
            libro* nuovoNodo = (libro*) malloc(sizeof(libro));// creo il nuovo nodo
            l->sx = nuovoNodo; //collego il nuovo nodo all'albero
            nuovoNodo->titolo = c; //il titolo del nodo punta alla stringa alla quale punta anche c, non deallocare attraverso c altrimenti perdi la stringa
            nuovoNodo->sx = NULL;
            nuovoNodo->dx = NULL;
    
            return nuovoNodo;
    Questa parte è palesemente bacata (è qui che schiatta tutto): se l è nullo, come fai a fare
    l->sx = nuovoNodo; //collego il nuovo nodo all'albero
    ???
  • Re: Alberi ABR

    Io l lo inizializzo a null, cmq ho risolto commentando l->sx=nuovoNodo
  • Re: Alberi ABR

    if (l == NULL)  { // Nuova foglia: alloco spazio
            l = (libro*) malloc(sizeof(libro));// creo il nuovo nodo
            l->titolo = c; //il titolo del nodo punta alla stringa alla quale punta anche c, non deallocare attraverso c altrimenti perdi la stringa
            l->sx = NULL;
            l->dx = NULL;
            return l;
        } else ...
    Non credo funzionerà, perché hai fatto altri errori che ora non sto qui a spiegarti, altrimenti ci passo la notte e non ne ho voglia... Io non avrei svolto così il programma, ma intanto inizia da quello. Comunque la funzione inserisci o la fai con la malloc interna (quindi allochi una struttura, poi testi se va a destra o a sinistra rispetto alla radice), o con la malloc esterna (quindi devi solo decidere se va a destra o sinistra, con eventuale controllo se l è valido).
  • Re: Alberi ABR

    Si infatti mi da ancora qualche problema. Va be grazie
Devi accedere o registrarti per scrivere nel forum
14 risposte