Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.55 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Nodo {
  5.     struct Nodo *left;
  6.     struct Nodo *right;
  7.     int info;
  8. } nodo;
  9.  
  10. typedef struct Stack {
  11.     nodo **listanodi;
  12.     int length;
  13.     int index;
  14. } stack;
  15.  
  16. typedef nodo* tree;
  17.  
  18. stack* NEW_STACK(int length) {
  19.     stack *s = (stack*)malloc(sizeof(stack));
  20.     s->index = -1;
  21.     s->length = length;
  22.     s->listanodi = (nodo**)malloc(length*sizeof(nodo*));
  23.    
  24.     printf("Creato stack\n");
  25.    
  26.     return s;
  27. }
  28.  
  29. void PRINT_STACK(stack *s) {
  30.     printf("Stack punta a indirizzo %p\n",s->listanodi);
  31.    
  32.     printf("Stampo stack\n");
  33.     for(int i=0;i<s->index;i++) {
  34.         printf("[%d]=>%p\n",i,s->listanodi[i]);
  35.     }
  36. }
  37.  
  38. nodo* POP(stack **s) { /* elimina elemento dallo stack */
  39.     nodo* last = ((*s)->listanodi)[(*s)->index];
  40.     //printf("Estratto %p\n",last);
  41.    
  42.     (*s)->index--;
  43.     return last;
  44. }
  45.  
  46. void PUSH(stack **s, nodo *nodo) { /* inserisce nuovo elemento nello stack */
  47.     if((*s)->index==(*s)->length-1) return; // stack pieno
  48.    
  49.     //printf("%p\n",nodo); // stampa indirizzo root
  50.     (*s)->index = (*s)->index+1;
  51.    
  52.     ((*s)->listanodi)[(*s)->index] = nodo;
  53. }
  54.  
  55. nodo *CREA_NODO(int info) { // crea un nodo
  56.     nodo *temp = (nodo*)malloc(sizeof(nodo));
  57.     temp->info = info;
  58.     temp->right = NULL;
  59.     temp->left = NULL;
  60.    
  61.     return temp;
  62. }
  63.  
  64. void ADD_NODO_RIC(nodo **nodo,int info) { // aggiunge un nodo all'albero binario
  65.     if(*nodo == NULL) {
  66.         printf("Nuovo nodo %d\n",info);
  67.         *nodo = CREA_NODO(info);
  68.         return;
  69.     }
  70.    
  71.     if((*nodo)->info < info) { // se nodo ha valore maggiore
  72.         ADD_NODO_RIC(&((*nodo)->right),info);
  73.     } else {
  74.         ADD_NODO_RIC(&((*nodo)->left),info);
  75.     }
  76. }
  77.  
  78.  
  79. void ADD_NODO(tree *t,int info) {
  80.     ADD_NODO_RIC(t,info);
  81. }
  82.  
  83. void PRINT_ALBERO(nodo *root) {
  84.     nodo *nodo = root;
  85.    
  86.     if(root==NULL) return; // albero vuoto
  87.    
  88.     stack *stack = NEW_STACK(30);
  89.     PUSH(&stack,NULL);
  90.    
  91.     printf("Stampo albero:\n");
  92.    
  93.     do { // fino a quando non viene esplorato tutto l'albero
  94.         if(nodo != NULL) {
  95.             PUSH(&stack,nodo);
  96.             nodo = nodo->left;
  97.         } else { // figlio sinistro = NULL
  98.             nodo = POP(&stack);
  99.            
  100.             while(nodo->right == NULL) {
  101.                 printf("%d \n",nodo->info);
  102.                 nodo = POP(&stack);
  103.             }
  104.            
  105.             printf("%d\n",nodo->info);
  106.            
  107.             nodo = nodo->right;
  108.         }
  109.     } while(stack->index != -1);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement