Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [c] Visita Albero

  1. #1
    Utente di HTML.it L'avatar di unicorn
    Registrato dal
    Aug 2004
    Messaggi
    176

    [c] Visita Albero

    Ciao a tutti, ho questo problema: ho un albero binario di ricerca in cui in ogni nodo ci sono diverse informazioni, il nodo è come segue

    struct nodo
    {
    int dataNascita;
    char Cognome;
    char Nome;
    int numMatricola;
    }

    il problema è che devo memorizzare in un'altra struttuta tutti i nodi con un numMatricola>654321, per cui devo scorrere l'intero albero, ho scritto questa procedura, ma non va bene. Dove sbaglio?

    void (*visita)(nodo *);

    /*visita secondo l'ordine simmetrico l'albero*/
    void inorder(nodo * r, void (*visita)(nodo *))
    {
    if(r)
    {
    inorder(r->figliominore,visita);
    visita(r);
    inorder(r->figliomaggiore,visita);
    }
    }

    void cerca(root *r, nodo *n)
    {
    inorder(r,n)
    if ((n->numMatricola)>654321)
    inserisci();// funz. che ho impl. ma che non compare qui
    print(inserisci);
    }

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Penso che l'operazione di inserimento dovresti farla direttamente durante la visita inorder, per fare ciò io passerei alla funzione inorder come argomento secondo argomento 'visita' un puntatore ad una funzione che fa l'inserimento:

    void insVisita(nodo *n){
    if ((n->numMatricola)>654321)
    ....codice per fare l'inserimento di n nella struttura
    }

    Quindi ti basta chiamare:

    inorder(r, insVisita);


    per ottenere l'inserimento degli elementi durante la visita.

    Nella tua funzione sbagli già a livello di tipi perche invochi inorder su due oggetti nodo*, mentre il secondo argomento di inorder è un puntatore a funzione.

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it L'avatar di unicorn
    Registrato dal
    Aug 2004
    Messaggi
    176
    Grazie per la dritta ho fatto questa prova

    void p(nodo *r)
    {
    int x, y, s;
    x=1;
    y=2;

    s=0;

    if(r->x >= x || r->y >= y)
    {
    s=s+1;
    printf("%d", s);
    }
    }


    void trova(nodo *r, void (p)(nodo *))
    {

    if (r != NULL)
    {
    trova(r->left, p);
    trova(r->up, p);
    trova(r->right, p);
    }
    }



    ma non restituisce nulla, anzi va in loop subito dopo if(r!=null)
    hai qualche suggerimento?

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Ma a che serve questa funzione???

    Trova prende come parametro la funzione p ma non la usa...si limita a passarla nelle chiamate ricorsive...devi utilizzare p nel caso base della ricorsione...e poi co'è il campo up del tipo nodo???

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  5. #5
    Utente di HTML.it L'avatar di unicorn
    Registrato dal
    Aug 2004
    Messaggi
    176
    L'obiettivo è quello di verificare se gira la funzione per la visita dell'albero.

    p è una funzione di test, nel senso che se riesco a far girare questa posso sostituire p con qualunque funzione.
    up è il puntatore del padre. (Che non serve a niente!!!)
    Ora però con qualche modifica funziona.


    Devo comunque ringraziarti!!!

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.