Advertisement
Guest User

Untitled

a guest
Dec 12th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.85 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct puusolmu_t {
  6. int luku;
  7. short tila; /* tasapainoilmaisin */
  8. struct puusolmu_t *vasen, *oikea;
  9. } puusolmu, *puuosoitin;
  10.  
  11.  
  12. void lisaa_solmu(puuosoitin *emo, int luku, int *etp);
  13. void oikea_kierto(puuosoitin *emo, int *etp);
  14. void tulosta_puu(puuosoitin solmu);
  15. void vasen_kierto(puuosoitin *emo, int *etp);
  16. void etsi_puusta(puuosoitin solmu, int haku);
  17. int maxDepth(puuosoitin solmu);
  18. void structure (puuosoitin solmu, int level );
  19.  
  20.  
  21.  
  22. int main(void)
  23. {
  24. FILE* myFile;
  25. myFile = fopen("/Users/oskar/OneDrive/Koulu/Tietorakenteet/Luento8/numerot.txt", "r");
  26.  
  27. /*read file into array*/
  28. int luvut[16];
  29. int x;
  30.  
  31. if (myFile == NULL){
  32. printf("Error Reading File\n");
  33. exit (0);
  34. }
  35.  
  36. for (x = 0; x < 16; x++){
  37. fscanf(myFile, "%d,", &luvut[x] );
  38. }
  39.  
  40. fclose(myFile);
  41.  
  42. int choice = 4, adder, haku;
  43. int etp = 0, i;
  44. puuosoitin puu = NULL;
  45.  
  46. for(i = 0; luvut[i] != 0; i++)
  47. {
  48. lisaa_solmu(&puu, luvut[i], &etp);
  49. printf("Vaihto\n");
  50. structure(puu,0);
  51. }
  52. printf("Nykyinen puu: ");
  53. structure(puu,0);
  54.  
  55.  
  56. printf("\n");
  57.  
  58. while(choice != 0){
  59. printf("\n1) Tulosta puu\n"
  60. "2) Etsi puusta\n"
  61. "3) Lisää puuhun\n"
  62. "0) Lopeta\n"
  63. "Valintasi: ");
  64. scanf("%d",&choice);
  65. if (choice == 1){
  66.  
  67. } else if (choice == 2){
  68. printf("Anna haettava luku: ");
  69. scanf("%d",&haku);
  70. etsi_puusta(puu, haku);
  71.  
  72. }else if (choice == 3){
  73. printf("Anna lisättävä luku: ");
  74. scanf("%d",&adder);
  75. structure(puu,0);
  76. lisaa_solmu(&puu,adder,&etp);
  77. structure(puu,0);
  78.  
  79.  
  80. }else if (choice == 0){
  81. printf("Kiitos");
  82. return 0;
  83. }else{
  84. printf("Virheellinen valinta");
  85. }
  86. }
  87.  
  88.  
  89.  
  90.  
  91.  
  92. }
  93.  
  94.  
  95. void lisaa_solmu(puuosoitin *emo, int luku, int *etp)
  96. {
  97.  
  98. if(!(*emo))
  99. {
  100. *etp = 1;
  101. if(!(*emo = (puuosoitin)malloc(sizeof(puusolmu))))
  102. {
  103. perror("malloc");
  104. exit(1);
  105. }
  106. (*emo)->vasen = (*emo)->oikea = NULL;
  107. (*emo)->tila = 0;
  108. (*emo)->luku = luku;
  109. } else if(luku < (*emo)->luku)
  110. {
  111. lisaa_solmu(&(*emo)->vasen, luku, etp);
  112. if(*etp)
  113. {
  114. switch((*emo)->tila)
  115. {
  116. case -1:
  117. (*emo)->tila = 0;
  118. *etp = 0;
  119. break;
  120. case 0:
  121. (*emo)->tila = 1;
  122. break;
  123. case 1:
  124. vasen_kierto(emo, etp);
  125. }
  126. }
  127. } else if(luku > (*emo)->luku)
  128. {
  129. lisaa_solmu(&(*emo)->oikea, luku, etp);
  130. if(*etp)
  131. {
  132. switch((*emo)->tila)
  133. {
  134. case 1:
  135. (*emo)->tila = 0;
  136. *etp = 0;
  137. break;
  138. case 0:
  139. (*emo)->tila = -1;
  140. break;
  141. case -1:
  142. oikea_kierto(emo, etp);
  143. }
  144. }
  145. } else
  146. {
  147. *etp = 0;
  148. printf("Luku %d on jo puussa\n", luku);
  149. }
  150. }
  151.  
  152.  
  153.  
  154. void vasen_kierto(puuosoitin *emo, int *etp)
  155. {
  156. puuosoitin lapsi, lapsenlapsi;
  157.  
  158. lapsi = (*emo)->vasen;
  159. if(lapsi->tila == 1) /* LL-kierto */
  160. {
  161. printf("LL-kierto\n");
  162. (*emo)->vasen = lapsi->oikea;
  163. lapsi->oikea = *emo;
  164. (*emo)->tila = 0;
  165. (*emo) = lapsi;
  166. } else /* LR-kierto */
  167. {
  168. printf("LR-kirto\n");
  169. lapsenlapsi = lapsi->oikea;
  170. lapsi->oikea = lapsenlapsi->vasen;
  171. lapsenlapsi->vasen = lapsi;
  172. (*emo)->vasen = lapsenlapsi->oikea;
  173. lapsenlapsi->oikea = *emo;
  174. switch(lapsenlapsi->tila)
  175. {
  176. case 1:
  177. (*emo)->tila = -1;
  178. lapsi->tila = 0;
  179. break;
  180. case 0:
  181. (*emo)->tila = lapsi->tila = 0;
  182. break;
  183. case -1:
  184. (*emo)->tila = 0;
  185. lapsi->tila = 1;
  186. }
  187. *emo = lapsenlapsi;
  188. }
  189. (*emo)->tila = 0;
  190. *etp = 0;
  191. }
  192.  
  193. void oikea_kierto(puuosoitin *emo, int *etp){
  194.  
  195. puuosoitin lapsi, lapsenlapsi;
  196.  
  197. lapsi = (*emo)->oikea;
  198. if(lapsi->tila == -1) /* LL-kierto --> RR */
  199. {
  200. printf("RR-kierto\n");
  201. (*emo)->oikea = lapsi->vasen;
  202. lapsi->vasen = *emo;
  203. (*emo)->tila = 0;
  204. (*emo) = lapsi;
  205. } else /* LR-kierto --> RL*/
  206. {
  207. printf("RL-kierto\n");
  208. lapsenlapsi = lapsi->vasen;
  209. lapsi->vasen = lapsenlapsi->oikea;
  210. lapsenlapsi->oikea = lapsi;
  211. (*emo)->oikea = lapsenlapsi->vasen;
  212. lapsenlapsi->vasen = *emo;
  213. switch(lapsenlapsi->tila)
  214. {
  215. case 1:
  216. (*emo)->tila = -1;
  217. lapsi->tila = 0;
  218. break;
  219. case 0:
  220. (*emo)->tila = lapsi->tila = 0;
  221. break;
  222. case -1:
  223. (*emo)->tila = 0;
  224. lapsi->tila = 1;
  225. }
  226. *emo = lapsenlapsi;
  227. }
  228. (*emo)->tila = 0;
  229. *etp = 0;
  230.  
  231. }
  232.  
  233. void etsi_puusta(puuosoitin solmu, int haku){
  234.  
  235. int found = 0;
  236. while (solmu != NULL){
  237. if(solmu->luku > haku){
  238. solmu = solmu->vasen;
  239. }else if (solmu->luku < haku){
  240. solmu = solmu->oikea;
  241. } else if(solmu->luku == haku){
  242. printf("Luku löytyi puusta\n");
  243. found = 1;
  244. break;
  245. }
  246. }
  247. if (found == 0){
  248. printf("Lukua ei löytynyt\n");
  249. }
  250.  
  251. }
  252.  
  253.  
  254. void tulosta_puu(puuosoitin solmu)
  255. {
  256. if(!solmu) {
  257. return;
  258. }
  259. tulosta_puu(solmu->vasen);
  260. printf("%d ", solmu->luku);
  261.  
  262. tulosta_puu(solmu->oikea);
  263. }
  264.  
  265. int maxDepth(puuosoitin solmu)
  266. {
  267. if (solmu==NULL)
  268. return 0;
  269. else
  270. {
  271.  
  272. /* compute the depth of each subtree */
  273. int lDepth = maxDepth(solmu->vasen);
  274. int rDepth = maxDepth(solmu->oikea);
  275.  
  276.  
  277. /* use the larger one */
  278. if (lDepth > rDepth)
  279. return(lDepth+1);
  280. else return(rDepth+1);
  281. }
  282. }
  283.  
  284.  
  285. void padding ( char ch, int n )
  286. {
  287. int i;
  288. for ( i = 0; i < n; i++ )
  289. putchar ( ch );
  290. }
  291. void structure (puuosoitin solmu, int level )
  292. {
  293. if ( solmu == NULL ) {
  294. padding ( '\t', level );
  295. puts ( "~" );
  296. }
  297. else {
  298. structure ( solmu->oikea, level + 1 );
  299. padding ( '\t', level );
  300. printf ( "%d\n", solmu->luku );
  301. structure ( solmu->vasen, level + 1 );
  302. }
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement