Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33

    [C] Problema funzione search (binary tree)

    Ciao a tutti !
    Devo scrivere un programma per la gestione dei parlamentari implementando il codice con gli alberi binari. Il programma, oltre alla funzioni di base, mi chiede di scrivere la funzioni "aggiungi voto parlamentare", essendo il campo Info definito come segue :

    codice:
    typedef struct SInfo{
       TKey key;
       TSat satellite;
       }TInfo;
    Dove:

    codice:
    typedef struct SKey{
       char tessera[8];
       }TKey;
    
    typedef struct SSat{
       char cognome[16];
       char nome[16];
       char partito[6];
       int voti;
       }TSat;
    Ho implementato la funzione in questo modo :

    codice:
    bool assegna_voto(TTree tree){
       TNode *parlamentare;
       TKey codice_tessera;
    
       printf("Inserire il codice tessera del parlamentare :");
       scanf("%s", codice_tessera.tessera);
    
       parlamentare=tree_search(tree, codice_tessera);
    
    printf("CHECKPOINT 2\n");
    
       if(parlamentare==NULL)
          return FALSE;
       else{
          parlamentare->info.satellite.voti++;
          return TRUE;
          }
       }
    Ora nel momento in cui invoco la funzione tree_search mi accorgo che il programma non arriva a CHECKPOINT 2, ma in esecuzione si blocca e mi da errore. La funzione search è la seguente :

    codice:
    TNode* tree_search(TTree tree, TKey key){
       printf("CHECKPOINT 1\n");
    
       if(tree==NULL || equal(tree->info.key, key)){
          printf("OKKEY\n");
          return tree;
          }
       else{
          if(greater(key, tree->info.key)){
             return tree_search(tree->right, key);
             }
          else return tree_search(tree->left, key);
          }
       }
    In pratica mi sono accorto che (ho provato ad inserire un solo parlamentare) la funzione search non entra nel primo if, visto che, essendoci un solo parlamentare alla prima invocazione il programma dovrebbe entrare nell'if, ma CHECKPOINT1 mi viene stampato 2 volte ! per la precisione la funzione verifica la condizione "greater(key, tree->info.key", ossia entra nell'if dell'else esterno.

    La funzione equal e greater le ho definite come segue :

    codice:
    bool greater(TKey key1, TKey key2){
       return strcmp(key1.tessera,key2.tessera)>0;
       }
    bool equal(TKey key1, TKey key2){
       return strcmp(key1.tessera,key2.tessera)==0;
       }
    qualcuno riesce a trovarmi l'errore grazie in anticipo per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Che errori ti da?
    Prova a vedere se ti può essere d'aiuto, è la stessa funzione applicata ad una lista:

    codice:
    bool assegna_voto(TList list){
        TKey key;
        TNode* node;
        key=read_key();
    
        node=list_search(list, key);
        if(node!=NULL){
            node->info.satellite.voti+=1;
            return true;
        }
        return false;
    }

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Potresti esserti dimenticato di settare a NULL i puntatori left e right nella funzione di inserimento...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Ce l'ho messo ma a prescindere, visto che nell'if c'è OR e il puntatore non punta a NULL, dovrebbe comunque verificare l'uguaglianza tra le key e restituire TRUE ma non lo fa :/ ne sto uscendo pazzo

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Posta l'inserimento e il punto in cui richiami la funzione.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Questa è la insert :
    codice:
    TTree tree_insert(TTree tree, TInfo info){
       if(tree==NULL){
          TNode *newnode;
          newnode=(TNode*)malloc(sizeof(TNode));
          assert(newnode!=NULL);
          newnode->right=newnode->left=NULL;
          newnode->info=info;
          return newnode;
          }
        else if(greater(tree->info.key, info.key)){
           tree->left=tree_insert(tree->left, info);
           return tree;
           }
        else{
           tree->right=tree_insert(tree->right, info);
           return tree;
           }
       }
    La richiamo nel menù del main :
    codice:
             case 1 :    info=read_info();
                         tree=tree_insert(tree,info);
                         system("PAUSE");

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Posta il codice di questa funzione:
    codice:
    read_info
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Ecco:
    codice:
    TInfo read_info(){
       TInfo info;
    
       info.key=read_key();
       info.satellite=read_satellite();
    
       return info;
       }
    
    
    TKey read_key(){
       TKey key;
    
       printf("Inserisci il codice della tessera :");
       scanf("%s", key.tessera);
    
       return key;
       }
    
    TSat read_satellite(){
       TSat satellite;
    
       printf("Inserire il cognome del parlamentare :");
       scanf("%s", satellite.cognome);
       printf("\nInserire il nome del parlamentare :");
       scanf("%s", satellite.nome);
       printf("\nInserire il partito di appartenenza :");
       scanf("%s", satellite.partito);
       satellite.voti=0;
    
       return satellite;
       }
    forse mi conviene riscrivere tutto daccapo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.