Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C]Problema ricorsione albero

    Eccovi il codice
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct albero* albero_t;
    struct albero
    {
      char* nome;
      int N;
      int annonascita;
      int annomorte;
      int ID;
      albero_t destro;
      albero_t sinistro;
    };
    albero_t costruiscialbero(albero_t il, char* nome, int ID, int annonascita, int annomorte);
    void stampalbero(albero_t il);
    albero_t ricerca(albero_t il,char* nomel);
    char* personalongeva(albero_t il);
    int main(int argc, char *argv[])
    {
      FILE* fp;
      albero_t il; albero_t nodo; il=NULL, nodo=NULL; char* nome; int ID; int annonascita; int annomorte; nome=malloc(sizeof(char)*256);
      fp=fopen("albero.txt","r");
      if (fp==NULL)
      {
        printf("Errore nell'apertura del file\n"); 
        return 0;}
      while(!feof(fp)){
       fscanf(fp,"%256[^ ] %d %d %d\n",nome,&ID,&annonascita,&annomorte);
       il=costruiscialbero(il,nome,ID,annonascita,annomorte); }
          
       stampalbero(il); 
       char* lung; lung=malloc(sizeof(char)*256);
       lung=personalongeva(il); printf("\nil piu' longevo e' %s\n",lung);
       char* nomel; nomel=malloc(sizeof(char)*256); int n;
       printf("\nInserisci il nome da cercare\n"); scanf("%s", nomel); 
       nodo=ricerca(il,nomel);
       if (nodo==NULL) printf("\nNon esiste\n");
       else printf("\n%s->%d->%d->%d\n",nodo->nome,nodo->ID,nodo->annonascita,nodo->annomorte);
                 
      system("PAUSE");	
      return 0;
    }
    
    char* personalongeva(albero_t il)
    {
         int x; char* nomes; nomes=malloc(sizeof(char)*256);
         if(il!=NULL)
         {
            if(((il->annomorte) - (il->annonascita)) > x)
            {
            x=((il->annomorte) - (il->annonascita)); 
            strcpy(nomes,il->nome);}
            personalongeva(il->destro);
            personalongeva(il->sinistro);
            }return nomes;}
            
    
    albero_t costruiscialbero(albero_t il, char* nome, int ID, int annonascita, int annomorte)
    {
         if (il==NULL)
         {
           il=malloc(sizeof(struct albero));
           il->nome=malloc(sizeof(char)+256); 
           strcpy(il->nome,nome);
           il->ID=ID;il->annonascita=annonascita;il->annomorte=annomorte;il->destro=NULL,il->sinistro=NULL;
           }
           else if(ID < il->ID) il->sinistro=costruiscialbero(il->sinistro,nome,ID,annonascita,annomorte);
           else if(ID > il->ID) il->destro=costruiscialbero(il->destro,nome,ID,annonascita,annomorte);
           else printf("elemento già inserito\n");
           return(il);
           }
           
    void stampalbero(albero_t il)
    {
         if(il!=NULL){
           printf("%s->%d->%d->%d\n",il->nome,il->ID,il->annonascita,il->annomorte);
           stampalbero(il->destro);
           stampalbero(il->sinistro);}}
         
    albero_t ricerca(albero_t il, char* nomel)
    {
         if ((il == NULL)|| strcmp(il->nome,nomel)==0)
         return il; 
         if(strcmp(il->nome,nomel)< 0) return ricerca(il->sinistro, nomel); 
         else return ricerca(il->destro, nomel);}
    Tutto funziona tranne la funzione per cercare la persona più longeva (sottolineata in grassetto). Come mai? Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quando fai il confronto

    if(((il->annomorte) - (il->annonascita)) > x)

    la variabile x non ha un valore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Se imposto x=0 ogni volta che richiamo la funzione me la reimposta a 0. Come posso modificare il codice affinchè funzioni?

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Usa una variabile statica, oppure passati il valore di x tra una chiamata e l' altra.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Tu sai vero che esistono delle regole per formattare (o indentare) il codice?
    Vedi per esempio qui:
    http://en.wikipedia.org/wiki/Indent_style

    1) Ti ripresento il tuo codice con lo stile K&R.
    2) Ho tolto qualche parentesi di troppo dove utilizzavi x.... non capisco per cosa... sai che esiste apposta STRNCPY vero?

    P.S. Ho visto se non altro una funzione costruisci e un typedef con il suffisso "_t", è già un miglioramento bravo.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct albero *albero_t;
    struct albero {
        char *nome;
        int N;
        int annonascita;
        int annomorte;
        int ID;
        albero_t destro;
        albero_t sinistro;
    };
    
    albero_t costruiscialbero(albero_t il, char *nome, int ID, int annonascita,
                              int annomorte);
    void stampalbero(albero_t il);
    albero_t ricerca(albero_t il, char *nomel);
    char *personalongeva(albero_t il);
    
    int main(int argc, char *argv[])
    {
        FILE *fp;
        albero_t il;
        albero_t nodo;
        il = NULL, nodo = NULL;
        char *nome;
        int ID;
        int annonascita;
        int annomorte;
        char *lung;
        char *nomel;
        int n;
        
        nome = malloc(sizeof(char) * 256);
        fp = fopen("albero.txt", "r");
        if (fp == NULL) {
            printf("Errore nell'apertura del file\n");
            return 0;
        }
        while (!feof(fp)) {
            fscanf(fp, "%256[^ ] %d %d %d\n", nome, &ID, &annonascita,
                   &annomorte);
            il = costruiscialbero(il, nome, ID, annonascita, annomorte);
        }
    
        stampalbero(il);
        lung = malloc(sizeof(char) * 256);
        lung = personalongeva(il);
        printf("\nil piu' longevo e' %s\n", lung);
        nomel = malloc(sizeof(char) * 256);
        printf("\nInserisci il nome da cercare\n");
        scanf("%s", nomel);
        nodo = ricerca(il, nomel);
        if (nodo == NULL)
            printf("\nNon esiste\n");
        else
            printf("\n%s->%d->%d->%d\n", nodo->nome, nodo->ID,
                   nodo->annonascita, nodo->annomorte);
    
        system("PAUSE");
        
        return 0;
    }
    
    char *personalongeva(albero_t il)
    {
        int x;
        char *nomes;
    
        nomes = malloc(sizeof(char) * 256);
        if (il != NULL) {
            if (il->annomorte - il->annonascita > x) {
                x = il->annomorte - il->annonascita;
                strcpy(nomes, il->nome);
            }
            personalongeva(il->destro);
            personalongeva(il->sinistro);
        }
    
        return nomes;
    }
    
    
    albero_t costruiscialbero(albero_t il, char *nome, int ID, int annonascita,
                              int annomorte)
    {
        if (il == NULL) {
            il = malloc(sizeof(struct albero));
            il->nome = malloc(sizeof(char) + 256);
            strcpy(il->nome, nome);
            il->ID = ID;
            il->annonascita = annonascita;
            il->annomorte = annomorte;
            il->destro = NULL, il->sinistro = NULL;
        } else if (ID < il->ID)
            il->sinistro =
                costruiscialbero(il->sinistro, nome, ID, annonascita,
                                 annomorte);
        else if (ID > il->ID)
            il->destro =
                costruiscialbero(il->destro, nome, ID, annonascita, annomorte);
        else
            printf("elemento già inserito\n");
            
        return il;
    }
    
    void stampalbero(albero_t il)
    {
        if (il != NULL) {
            printf("%s->%d->%d->%d\n", il->nome, il->ID, il->annonascita,
                   il->annomorte);
            stampalbero(il->destro);
            stampalbero(il->sinistro);
        }
    }
    
    albero_t ricerca(albero_t il, char *nomel)
    {
        if ((il == NULL) || strcmp(il->nome, nomel) == 0)
            return il;
    
        if (strcmp(il->nome, nomel) < 0)
            return ricerca(il->sinistro, nomel);
        else
            return ricerca(il->destro, nomel);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.