Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152

    [C] Visita abr pre-order iterativa

    Ho questo problema, ho implementato la visita pre-order di un albero binario, però com'è intuibile in questo modo viene modificata la radice dell'albero cambiando curr, dato che curr punterà proprio alla zona di memoria allocata da root. Come faccio per visitare l'albero e non modificare root al ritorno ?

    codice:
    void print_abr_pre(tree *root,funzioni *funz){
         stack *st=NULL;
         tree *curr=root;
         while((st) || (curr)){
         	if(curr){
         		funz->output(curr->inf);
         		st=push(st,curr);
         		curr=curr->sx;
         	}
         	else{
         		curr=top(st);
         		st=pop(st);
         		curr=curr->dx;
         	}
         }
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Vedi che non modifichi proprio nulla, a parte curr che è una variabile locale che contiene un indirizzo...
    Finchè non scrivi una cosa del genere
    codice:
    curr->sx = nodo;
    non modifichi nulla a livello globale...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    Ma io faccio puntare curr all'area di memoria di root, quindi poi scendendo a sinistra con curr=curr->sx non faccio altro che modificare anche il valore in root, giusto ?

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Originariamente inviato da johnnny
    Ma io faccio puntare curr all'area di memoria di root, quindi poi scendendo a sinistra con curr=curr->sx non faccio altro che modificare anche il valore in root, giusto ?
    No curr è una variabile locale! E cambi il suo valore locale! (anche root è una variabile locale a dirla tutta)
    Per cambiare qualcosa a livello globale devi necessariamente deferenziare un puntatore prima di assegnare un valore, cosa che giustamente non fai...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    Hai pienamente ragione, scara e allora com'è possibile che io di ritorno al sottoprogramnma che chiama questa funzione mi ritrovo con root che punta non più alla radice ma un altro indirizzo. Infattis e provo ad eseguire due volte consecutive la stampa, la prima va bene e la seconda mi da segmentation fault.

    codice:
    void stampa_vet_abr(tree **vet_abr,funzioni *funz){
    	int i,scelta;
    	tree *root;
    	system("cls");
    	printf("\n\n Che tipo di visita vuoi effettuare per la stampa ?");
    	printf("\n (1) Pre-Order");
    	printf("\n (2) Post-Order");
    	printf("\n\n Tasto digitato :  ");
    	scanf("%d",&scelta);
    	getchar();
    	for(i=0;i<15;i++){
    		if(vet_abr[i]!=NULL){
    			root=vet_abr[i];
    			printf("\n Albero %d  ",i);
    			stampa_abr(root,funz,scelta);
    		}
    	}
    }
    
    
    
    void stampa_abr(tree *root,funzioni *funz,int scelta){
         printf("\n\n");
         if(scelta==1)
              print_abr_pre(root,funz);
         else if(scelta==2)
    	          print_abr_post(root,funz);
    		   else
    		         printf(" La scelta effettuata non è prevista ");	       
         printf("\n\n");
    }
    
    
    void print_abr_pre(tree *root,funzioni *funz){
         stack *st=NULL;
         tree *curr=root;
         while((st) || (curr)){
         	if(curr){
         		funz->output(curr->inf);
         		st=push(st,curr);
         		curr=curr->sx;
         	}
         	else{
         		curr=top(st);
         		st=pop(st);
         		curr=curr->dx;
         	}
         }
    }

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Posta il minimo codice compilabile ed eseguibile in cui ritrovi il problema...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    152
    codice:
    void stampa_abr(tree *root,funzioni *funz,int scelta){
         printf("\n\n");
         if(scelta==1)
              print_abr_pre(root,funz);
    
              ***Stampando qui il valore di root mi da un indirizzo anomalo ***
        
         else if(scelta==2)
    	          print_abr_post(root,funz);
    		   else
    		         printf(" La scelta effettuata non è prevista ");	       
         printf("\n\n");
    }
    
    
    void print_abr_pre(tree *root,funzioni *funz){
         stack *st=NULL;
         tree *curr=root;
         while((st) || (curr)){
         	if(curr){
         		funz->output(curr->inf);
         		st=push(st,curr);
         		curr=curr->sx;
         	}
         	else{
         		curr=top(st);
         		st=pop(st);
         		curr=curr->dx;
         	}
         }
    }
    Se stampo il valore di root nella funzione stampa_abr dopo che ha eseguito print_abr_pre il valore in output risulta essere un indirizzo anomalo e non più il numero che compariva nella radice dell'albero creato.

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.