Advertisement
Dany1858

inf. Esercizio Alberi binari v3 (+ricerca)

Jan 10th, 2015
511
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.14 KB | None | 0 0
  1. /*Memorizzare i dati immessi in un albero binario in modo che l etichetta di un
  2. qualsiasi nodo sia maggiore di tutti i valorei del suo sottoalbero sinistro, e
  3. minore di tutti quelli del suo sottoalbero destro*/
  4.  
  5. #include <stdio.h>
  6. #include <malloc.h>
  7.  
  8. struct nodo{
  9.        int inf;
  10.        struct nodo *left;
  11.        struct nodo *right;
  12. };
  13.  
  14. int menuAlb(void);
  15. struct nodo *albBin(struct nodo *);
  16. struct nodo *creaNodo(struct nodo *, int);
  17. void anticipato(struct nodo *, int);
  18. void ciclo(int);
  19. void ricerca(struct nodo *);
  20. void ricBin(struct nodo *, int, struct nodo **);
  21.  
  22. main()
  23. {
  24.   int menu=-1;
  25.   struct nodo *radice=NULL;
  26.   while(menu!=0){
  27.   if(menu==-1) menu=1;
  28.   else menu=menuAlb();
  29.   switch(menu){
  30.      case 1:{ system("cls"); radice=albBin(radice); break;}
  31.      case 2:{ ricerca(radice); break;}
  32.      case 4:{ system("cls"); printf("\nVISITA IN ORDINE ANTICIPATO a SOMMARIO\n\n");
  33.               anticipato(radice, 0); printf("\n\nIn attesa..\t"); getchar(); break;}
  34.      case 0:{ return 0;}
  35.      default:{ printf("\nValore non ammesso"); getchar(); break;}
  36.   }}
  37. }
  38.  
  39. int menuAlb()
  40. {
  41.     int menu;
  42.     system("cls");
  43.     printf("\n------------- MENU'------------\n");
  44.     printf("\n1. Immettere valore\n\n2. Ricerca elemento\n\n4. Stampa albero\n\n0. Exit\n\n ");
  45.     scanf("%d", &menu);
  46.     getchar();
  47.     return menu;
  48. }
  49.  
  50. struct nodo *albBin(struct nodo *p)
  51. {
  52.        int x=-1;
  53.        
  54.        while(x!=0){
  55.           printf("\nInserire elemento, 0 per uscire\t");
  56.           scanf("%d", &x);
  57.           if(x!=0) p=creaNodo(p, x);}
  58.        return p;
  59. }
  60.  
  61. struct nodo *creaNodo(struct nodo *p, int val)
  62. {
  63.        if(p==NULL){
  64.           p=(struct nodo*)malloc(sizeof(struct nodo));
  65.           p->inf=val;
  66.           p->left=NULL;
  67.           p->right=NULL;
  68.        }
  69.        else{
  70.           if(val>p->inf) p->right=creaNodo(p->right, val);
  71.           else if(val<p->inf) p->left=creaNodo(p->left, val);
  72.              else{
  73.                  printf("\nElemento gia' presente!\n");
  74.                  getchar();}
  75.        }
  76.        return p;
  77. }
  78.  
  79. void ricerca(struct nodo *p)
  80. {
  81.      int val;
  82.      struct nodo *pEle=NULL;
  83.      system("cls");
  84.      printf("\nInserisci elemento da cercare\t");
  85.      scanf("%d", &val); printf("\n");
  86.      ricBin(p, val, &pEle);
  87.      if(pEle==NULL) printf("\tElemento non presente!");
  88.      printf("\n\nIn attesa..\t"); getchar(); getchar();
  89. }
  90.  
  91. void ricBin(struct nodo *p, int val, struct nodo **pEle)
  92. {
  93.      if(p!=NULL)
  94.          if(val==p->inf){ printf("   trovato!"); *pEle=p;}
  95.      else
  96.          if(val<p->inf){ printf("   sinistra"); ricBin(p->left, val, pEle);}
  97.          else{ printf("   destra"); ricBin(p->right, val, pEle);}
  98. }
  99.  
  100.  
  101. void anticipato(struct nodo *p, int n)
  102. {
  103.      if(p!=NULL){
  104.          ciclo(n); n++;
  105.          printf("* %d", p->inf);
  106.          printf("\n");
  107.          if(p->left!=NULL) anticipato(p->left, n);
  108.          else{ ciclo(n); printf("*");}
  109.          printf("\n");
  110.          if(p->right!=NULL) anticipato(p->right, n);
  111.          else{ ciclo(n); printf("*");}}
  112.      else printf("\nAlbero vuoto!!");
  113. }
  114.  
  115. void ciclo(int n)
  116. {
  117.      int i;
  118.      for(i=0; i<n; i++) printf("  ");
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement