darkjessy94

Albero_Binario_Funzioni

Sep 1st, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Info{
  4. int num;
  5. };
  6. typedef struct Info TInfo;
  7.  
  8. struct Nodo{
  9. TInfo info;
  10. struct Nodo *destro;
  11. struct Nodo *sinistro;
  12. };
  13. typedef struct Nodo TNodo;
  14. typedef TNodo *Albero;
  15.  
  16. Albero Crea_Albero();
  17. void Distruggi_Nodo(TNodo *nodo);
  18. Albero Inserisci_Elemento(Albero bt, TInfo info);
  19. TInfo Leggi_Info();
  20. void Stampa_Info(TInfo info);
  21. void Stampa_Albero(Albero bt);
  22. Albero Distruggi_Albero(Albero bt);
  23. TNodo *Ricerca(Albero bt,TInfo info);
  24. TNodo *Cerca_Minimo(Albero bt);
  25. Albero Cancella_Elemento(Albero bt,TInfo info);
  26.  
  27. int main()
  28. {
  29. Albero bt;
  30. TInfo info;
  31. int i,dim;
  32. TNodo *min,*search;
  33.  
  34. bt=Crea_Albero();
  35.  
  36. printf("Quanti elementi vuoi inserire?: ");scanf("%d",&dim);
  37. for (i=0;i<dim;i++)
  38. {
  39. info=Leggi_Info();
  40. bt=Inserisci_Elemento(bt,info);
  41. }
  42. ///stampa albero
  43. printf("\nElementi dell'albero\n");
  44. Stampa_Albero(bt);
  45. ///RICERCA ELEMENTO
  46. printf("\n\nRicerca elemento\n");
  47. info=Leggi_Info();
  48. search=Ricerca(bt,info);
  49. if(search==NULL)
  50. printf("Elemento non presente!\n");
  51. else
  52. printf("Elemento presente!\n");
  53.  
  54. ///INSERISCI UN NUOVO ELEM e ristampa per vedere se
  55. ///se è ancora in ordine l'albero binario
  56. printf("\nInserisci un nuovo elemento\n");
  57. info=Leggi_Info();
  58. bt=Inserisci_Elemento(bt,info);
  59. Stampa_Albero(bt);
  60.  
  61. ///CANCELLA ELEMENTO e ristampa
  62. printf("\n\nCancella elemento\n");
  63. info=Leggi_Info();
  64. bt=Cancella_Elemento(bt,info);
  65. Stampa_Albero(bt);
  66.  
  67. ///STAMPA MINIMO
  68. min=Cerca_Minimo(bt);
  69. printf("\n\nMinimo: ");
  70. Stampa_Info(min->info);
  71. printf("\n");
  72. return 0;
  73. }
  74. Albero Crea_Albero()
  75. {
  76. return NULL;
  77. }
  78. void Distruggi_Nodo(TNodo *nodo)
  79. {
  80. free(nodo);
  81. }
  82. Albero Inserisci_Elemento(Albero bt, TInfo info)
  83. {
  84. if(bt==NULL)
  85. {
  86. TNodo *nuovo_nodo;
  87. nuovo_nodo=(TNodo*)malloc(sizeof(TNodo));
  88. nuovo_nodo->info=info;
  89. nuovo_nodo->destro=NULL;
  90. nuovo_nodo->sinistro=NULL;
  91. if(nuovo_nodo==NULL)
  92. {
  93. printf("\nErrore di allocazione");
  94. exit(1);
  95. }
  96. return nuovo_nodo;
  97. }
  98. else if(info.num < bt->info.num)
  99. {
  100. bt->sinistro=Inserisci_Elemento(bt->sinistro,info);
  101. return bt;
  102. }
  103. else
  104. {
  105. bt->destro=Inserisci_Elemento(bt->destro,info);
  106. return bt;
  107. }
  108.  
  109. }
  110. TInfo Leggi_Info()
  111. {
  112. TInfo info;
  113. printf("\nInserisci numero: ");
  114. scanf("%d",&(info.num));
  115. return info;
  116. }
  117. void Stampa_Info(TInfo info)
  118. {
  119. printf("%d ",info.num);
  120. }
  121. void Stampa_Albero(Albero bt)
  122. {
  123. if(bt!=NULL)
  124. {
  125. Stampa_Albero(bt->sinistro);
  126. Stampa_Info(bt->info);
  127. Stampa_Albero(bt->destro);
  128. }
  129. }
  130.  
  131. Albero Distruggi_Albero(Albero bt)
  132. {
  133. if(bt==NULL)
  134. return NULL;
  135. if(bt->destro==NULL && bt->sinistro==NULL)
  136. {
  137. free(bt);
  138. return NULL;
  139. }
  140. else
  141. {
  142. bt->sinistro=Distruggi_Albero(bt->sinistro);
  143. bt->destro=Distruggi_Albero(bt->destro);
  144. Distruggi_Nodo(bt);
  145. return NULL;
  146. }
  147. }
  148.  
  149. TNodo *Ricerca(Albero bt,TInfo info)
  150. {
  151. if(bt==NULL || bt->info.num == info.num)
  152. return bt;
  153. else
  154. {
  155. if(info.num < bt->info.num)
  156. return Ricerca(bt->sinistro,info);
  157. else
  158. return Ricerca(bt->destro,info);
  159. }
  160. }
  161.  
  162. TNodo *Cerca_Minimo(Albero bt)
  163. {
  164. if(bt==NULL)
  165. return NULL;
  166. else if(bt->sinistro==NULL)
  167. return bt;
  168. else
  169. {
  170. Albero min=Cerca_Minimo(bt->sinistro);
  171. return min;
  172. }
  173. }
  174.  
  175. Albero Cancella_Elemento(Albero bt,TInfo info)
  176. {
  177. if(bt==NULL)
  178. return NULL;
  179. else if(info.num < bt->info.num)
  180. {
  181. bt->sinistro=Cancella_Elemento(bt->sinistro,info);
  182. return bt;
  183. }
  184. else if(info.num > bt->info.num)
  185. {
  186. bt->destro=Cancella_Elemento(bt->destro,info);
  187. return bt;
  188. }
  189. else ///info.num == bt->info.num . E' STATO TROVATO IL NODO DA ELIMINARE
  190. { /// VARI CASI
  191. if(bt->destro==NULL && bt->sinistro==NULL)/// NODO FOGLIA
  192. {
  193. Distruggi_Nodo(bt);
  194. return NULL;
  195. }
  196. else if(bt->destro == NULL)/// NODO CON SOLO IL FIGLIO DX
  197. {
  198. Albero p; ///albero usato per salvare ciò che andrebbe perso dopo la cancellazione del nodo
  199. p=bt->sinistro;
  200. Distruggi_Nodo(bt);
  201. return p;
  202. }
  203. else if(bt->sinistro == NULL)///NODO CON SOLO IL FIGLIO SX
  204. {
  205. Albero p; ///albero usato per salvare ciò che andrebbe perso dopo la cancellazione del nodo
  206. p=bt->destro;
  207. Distruggi_Nodo(bt);
  208. return p;
  209. }
  210. ///NODO CON ENTRAMBI I FIGLI - DOBBIAMO PRESERVARE L'ORDINE DEI COLLEGAMENTI
  211. ///MIN DX mi serve trovare il minimo del sottoalbero dx per sostituirlo al nodo da eliminare
  212. Albero min_destro;
  213. min_destro=Cerca_Minimo(bt->destro);
  214. bt->info=min_destro->info; ///sostituisci l'elem da cancellare con il min_dx
  215. bt->destro=Cancella_Elemento(bt->destro,min_destro->info); ///ora dobbiamo cancellare min_dx perché
  216. ///ne abbiamo due a causa della
  217. ///sostituzione dell'elem precedente
  218.  
  219. return bt;
  220. }
  221. }
Add Comment
Please, Sign In to add comment