Advertisement
Guest User

Untitled

a guest
Dec 9th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.72 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. typedef struct puusolmu_t {
  7. int luku;
  8. short tila; /* tasapainoilmaisin */
  9. struct puusolmu_t *vasen, *oikea;
  10. } puusolmu, *puuosoitin;
  11.  
  12. void lisaa_solmu(puuosoitin *, int, int *);
  13. void oikea_kierto(puuosoitin *, int *);
  14. void tulosta_puu(puuosoitin);
  15. void tulosta_puu_muotoilu(puuosoitin, int, int);
  16. void vasen_kierto(puuosoitin *, int *);
  17. int etsi_solmu(puuosoitin *, int);
  18. int* lue_luvut(char*);
  19. int* generoi_luvut();
  20.  
  21. #define MAXAMOUNT 10240
  22.  
  23. int main()
  24. {
  25. int etp = 0, i;
  26. int *luvut;
  27. puuosoitin puu = NULL;
  28.  
  29. clock_t begin = clock();
  30.  
  31. /*luvut = lue_luvut("numbers.txt");*/
  32. luvut = generoi_luvut();
  33.  
  34. for(i = 0; luvut[i] != 0; i++)
  35. {
  36. lisaa_solmu(&puu, luvut[i], &etp);
  37. printf("Lisättiin %d. luku: %d\n", i, luvut[i]);
  38. }
  39. tulosta_puu(puu);
  40. printf("\n");
  41.  
  42. clock_t end = clock();
  43. double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  44. printf("%lf", time_spent);
  45.  
  46. /*etsi_solmu(&puu, 2);
  47. etsi_solmu(&puu, 12);*/
  48.  
  49. return 0;
  50. }
  51.  
  52. int* generoi_luvut(){
  53. srand(time(NULL));
  54. static int numerot[MAXAMOUNT];
  55. int i = 0;
  56.  
  57. while(i < MAXAMOUNT){
  58. double scaled = (double)rand()/RAND_MAX;
  59. numerot[i] = (MAXAMOUNT - 1 +1)*scaled + 1;
  60. i++;
  61. }
  62.  
  63. return numerot;
  64. }
  65.  
  66. int* lue_luvut(char *tiedosto){
  67. FILE* file = fopen(tiedosto, "r");
  68. int n = 0, i = 0;
  69. static int numerot[MAXAMOUNT];
  70.  
  71. if(file == NULL){
  72. perror("Error opening file!");
  73. return NULL;
  74. }
  75.  
  76. while( fscanf(file, "%d\n", &n) > 0 )
  77. {
  78. numerot[i++] = n;
  79. }
  80. fclose(file);
  81. return numerot;
  82. }
  83.  
  84. void lisaa_solmu(puuosoitin *emo, int luku, int *etp)
  85. {
  86. if(!(*emo))
  87. {
  88. *etp = 1;
  89. if(!(*emo = (puuosoitin)malloc(sizeof(puusolmu))))
  90. {
  91. perror("malloc");
  92. exit(1);
  93. }
  94. (*emo)->vasen = (*emo)->oikea = NULL;
  95. (*emo)->tila = 0;
  96. (*emo)->luku = luku;
  97. } else if(luku < (*emo)->luku)
  98. {
  99. lisaa_solmu(&(*emo)->vasen, luku, etp);
  100. if(*etp)
  101. {
  102. switch((*emo)->tila)
  103. {
  104. case -1:
  105. (*emo)->tila = 0;
  106. *etp = 0;
  107. break;
  108. case 0:
  109. (*emo)->tila = 1;
  110. break;
  111. case 1:
  112. vasen_kierto(emo, etp);
  113. }
  114. }
  115. } else if(luku > (*emo)->luku)
  116. {
  117. lisaa_solmu(&(*emo)->oikea, luku, etp);
  118. if(*etp)
  119. {
  120. switch((*emo)->tila)
  121. {
  122. case 1:
  123. (*emo)->tila = 0;
  124. *etp = 0;
  125. break;
  126. case 0:
  127. (*emo)->tila = -1;
  128. break;
  129. case -1:
  130. oikea_kierto(emo, etp);
  131. }
  132. }
  133. } else
  134. {
  135. *etp = 0;
  136. printf("Luku %d on jo puussa\n", luku);
  137. }
  138. }
  139.  
  140. void tulosta_puu(puuosoitin solmu)
  141. {
  142. if(!solmu) return;
  143. char ch;
  144.  
  145. tulosta_puu_muotoilu(solmu->oikea, 1, 1);
  146. printf("\n%d(%d)\t", solmu->luku, solmu->tila);
  147. tulosta_puu_muotoilu(solmu->vasen, 1, 0);
  148. printf("\n\n____________________________________________");
  149. //getchar();
  150. }
  151.  
  152. void tulosta_puu_muotoilu(puuosoitin solmu, int syvyys, int oikea)
  153. {
  154. if(!solmu) return;
  155.  
  156. char *nuoli;
  157. if(oikea){
  158. nuoli = "↗";
  159. }else{
  160. nuoli = "↘";
  161. }
  162.  
  163. tulosta_puu_muotoilu(solmu->oikea, syvyys + 1, 1);
  164.  
  165. printf("\n");
  166. int i = 0;
  167. for(; i < syvyys; i++){
  168. printf("\t");
  169. }
  170. printf("%s %d(%d)", nuoli, solmu->luku, solmu->tila);
  171. tulosta_puu_muotoilu(solmu->vasen, syvyys + 1, 0);
  172. }
  173.  
  174. void vasen_kierto(puuosoitin *emo, int *etp)
  175. {
  176. puuosoitin lapsi, lapsenlapsi;
  177.  
  178. lapsi = (*emo)->vasen;
  179. if(lapsi->tila == 1) /* LL-kierto */
  180. {
  181. printf("LL-KIERTO\n");
  182. (*emo)->vasen = lapsi->oikea;
  183. lapsi->oikea = *emo;
  184. (*emo)->tila = 0;
  185. (*emo) = lapsi;
  186. } else /* LR-kierto */
  187. {
  188. printf("LR-KIERTO\n");
  189. lapsenlapsi = lapsi->oikea;
  190. lapsi->oikea = lapsenlapsi->vasen;
  191. lapsenlapsi->vasen = lapsi;
  192. (*emo)->vasen = lapsenlapsi->oikea;
  193. lapsenlapsi->oikea = *emo;
  194. switch(lapsenlapsi->tila)
  195. {
  196. case 1:
  197. (*emo)->tila = -1;
  198. lapsi->tila = 0;
  199. break;
  200. case 0:
  201. (*emo)->tila = lapsi->tila = 0;
  202. break;
  203. case -1:
  204. (*emo)->tila = 0;
  205. lapsi->tila = 1;
  206. }
  207. *emo = lapsenlapsi;
  208. }
  209. (*emo)->tila = 0;
  210. *etp = 0;
  211. }
  212.  
  213. void oikea_kierto(puuosoitin *emo, int *etp)
  214. {
  215. puuosoitin lapsi, lapsenlapsi;
  216.  
  217. lapsi = (*emo)->oikea;
  218. if(lapsi->tila == -1) /* RR-kierto */
  219. {
  220. printf("RR-KIERTO\n");
  221. (*emo)->oikea = lapsi->vasen;
  222. lapsi->vasen = *emo;
  223. (*emo)->tila = 0;
  224. (*emo) = lapsi;
  225. } else /* RL-kierto */
  226. {
  227. printf("RL-KIERTO\n");
  228. lapsenlapsi = lapsi->vasen;
  229. lapsi->vasen = lapsenlapsi->oikea;
  230. lapsenlapsi->oikea = lapsi;
  231. (*emo)->oikea = lapsenlapsi->vasen;
  232. lapsenlapsi->vasen = *emo;
  233. switch(lapsenlapsi->tila)
  234. {
  235. case 1:
  236. (*emo)->tila = -1;
  237. lapsi->tila = 0;
  238. break;
  239. case 0:
  240. (*emo)->tila = lapsi->tila = 0;
  241. break;
  242. case -1:
  243. (*emo)->tila = 0;
  244. lapsi->tila = 1;
  245. }
  246. *emo = lapsenlapsi;
  247. }
  248. (*emo)->tila = 0;
  249. *etp = 0;
  250. }
  251.  
  252. int etsi_solmu(puuosoitin *emo, int luku){
  253. if(luku > (*emo)->luku){
  254. if((*emo)->oikea == NULL){
  255. printf("Solmua %d ei ole puussa!\n", luku);
  256. return 0;
  257. }
  258. return etsi_solmu(&(*emo)->oikea, luku);
  259. }else if(luku < (*emo)->luku){
  260. if((*emo)->vasen == NULL){
  261. printf("Solmua %d ei ole puussa!\n", luku);
  262. return 0;
  263. }
  264. return etsi_solmu(&(*emo)->vasen, luku);
  265. }else{
  266. printf("Solmu %d löytyi puusta!\n", luku);
  267. return 1;
  268. }
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement