Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct elDrzewa
  5. {
  6. int dana;
  7. struct elDrzewa *prawy;
  8. struct elDrzewa *lewy;
  9. struct elDrzewa *rodzic;
  10. }drzewo;
  11.  
  12. drzewo *T=NULL, *D=NULL;
  13. FILE *F;
  14. char a;
  15.  
  16. drzewo *dodajD(drzewo *T, int x, drzewo *rodzic)
  17. {
  18. drzewo *q;
  19. if(T==NULL)
  20. {
  21. q=malloc(sizeof(drzewo));
  22. q->dana=x;
  23. q->lewy=NULL;
  24. q->prawy=NULL;
  25. q->rodzic=rodzic;
  26. return q;
  27. }
  28. else{
  29. if(T->dana<x)
  30. T->prawy=dodajD(T->prawy,x,T);
  31. else
  32. T->lewy=dodajD(T->lewy,x,T);
  33. return T;
  34. }
  35. }
  36.  
  37.  
  38.  
  39. void drukowanieDrzewa(drzewo *d, unsigned h, unsigned long long M)
  40. {
  41. if (d == NULL)
  42. {
  43. printf("Drzewo jest puste.");
  44. //return 0;
  45. }
  46. int i;
  47. if (d->prawy)
  48. drukowanieDrzewa(d->prawy, h + 1, M << 1);
  49. for (i = h - 2; i < h; --i)
  50. {
  51. unsigned long long m = (M >> i) & 3;
  52.  
  53. if ((m == 0) || (m == 3))
  54. printf(" ");
  55. else
  56. printf("\xB3");
  57. printf(" ");
  58. }
  59. if (h)
  60. {
  61. if (M & 1)
  62. printf("\xC0");
  63. else
  64. printf("\xDA");
  65. printf("\xC4");
  66. }
  67. printf("%d \n", d->dana);
  68. if (d->lewy)
  69. drukowanieDrzewa(d->lewy, h + 1, (M << 1) | 1);
  70. //return 1;
  71. }
  72.  
  73. void drukuj_struk(drzewo *T, int glebokosc)
  74. {
  75. int i;
  76. if (T==0)
  77. return;
  78.  
  79. drukuj_struk(T->lewy,glebokosc+1);
  80.  
  81. for(i=0;i<glebokosc;i++)
  82. putchar(' ');
  83.  
  84. printf("%d\n",T->dana);
  85. drukuj_struk(T->prawy,glebokosc+1);
  86. }
  87.  
  88. drzewo *szukanieD(drzewo *T,int x)
  89. {
  90. if(T!=0)
  91. {
  92. if(T->dana==x)
  93. {
  94. printf("element znaleziony\n");
  95. return T;
  96. }
  97. else if(T->dana>x)
  98. {
  99. szukanieD(T->lewy,x);
  100. }
  101. else if(T->dana<x)
  102. {
  103. szukanieD(T->prawy,x);
  104. }
  105. }
  106. else
  107. {
  108. printf("nie znaleziono elementu w drzewie\n");
  109. return NULL;
  110. }
  111. }
  112.  
  113. drzewo *znajdz_MIN(drzewo *T)
  114. {
  115. drzewo *q=T;
  116. if(T==NULL)
  117. {
  118. printf("Drzewo nie ma min");
  119. }
  120. else
  121. {
  122. while(q->lewy!=NULL)
  123. q=q->lewy;
  124.  
  125. printf("Element MIN: %d\n",q->dana);
  126. return q;
  127. }
  128. }
  129.  
  130. drzewo *znajdz_MAX(drzewo *T)
  131. {
  132. drzewo *q=T;
  133. if(T==NULL)
  134. {
  135. printf("Drzewo nie ma min");
  136. }
  137. else
  138. {
  139. while(q->prawy!=NULL)
  140. q=q->prawy;
  141.  
  142. printf("Element MAX: %d\n",q->dana);
  143. return q;
  144. }
  145. }
  146.  
  147. drzewo *poprzednik(drzewo *q)
  148. {
  149. drzewo *p;
  150. if(q->lewy)
  151. return znajdz_MAX(q->lewy);
  152. else
  153. {
  154. p=q->rodzic;
  155. while (p && p->lewy == q)
  156. {
  157. q=p;
  158. p=q->rodzic;
  159. }
  160. if(p!=NULL)
  161. return NULL;
  162. else
  163. return p;
  164. }
  165. }
  166.  
  167. drzewo *nastepnik(drzewo *q)
  168. {
  169. drzewo *p;
  170. if(q->prawy)
  171. return znajdz_MIN(q->prawy);
  172. else
  173. {
  174. p=q->rodzic;
  175. while (p && p->prawy == q)
  176. {
  177. q=p;
  178. p=q->rodzic;
  179. }
  180. if(p!=NULL)
  181. return NULL;
  182. else
  183. return p;
  184. }
  185. }
  186.  
  187. drzewo *usunD(drzewo *T, int x)
  188. {
  189. drzewo *w,*v;
  190. if (T!=NULL)
  191. {
  192. if(T->dana>x)
  193. {
  194. T->lewy=usunD(T->lewy,x);
  195. return T;
  196. }
  197.  
  198. if(T->dana<x)
  199. {
  200. T->prawy=usunD(T->prawy,x);
  201. return T;
  202. }
  203.  
  204. w=T;
  205. if(w->lewy==NULL)
  206. v=w->prawy;
  207.  
  208. else if(w->prawy==NULL)
  209. v=w->lewy;
  210.  
  211. else
  212. {
  213. w=w->lewy;
  214. if(w->prawy==NULL)
  215. {
  216. T->lewy=w->lewy;
  217. T->dana=w->dana;
  218. v=T;
  219. }
  220. else
  221. {
  222. v=T;
  223. while(w->prawy!=NULL)
  224. {
  225. v=w;
  226. w=w->prawy;
  227. }
  228. v->prawy=w->lewy;
  229. T->dana=w->dana;
  230. v=T;
  231. }
  232. }
  233. free(w);
  234. return v;
  235. }
  236.  
  237. }
  238.  
  239.  
  240. void zapisz_do_pliku(drzewo *T, FILE *F)
  241. {
  242. if(T!=NULL)
  243. {
  244. fprintf(F,"%d\t",T->dana);
  245. zapisz_do_pliku(T->lewy,F);
  246. zapisz_do_pliku(T->prawy,F);
  247. }
  248. else fprintf(F, "0\t");
  249. }
  250.  
  251.  
  252. drzewo *dodaj_z_pliku(drzewo *T, FILE *F, int rodzic)
  253. {
  254. drzewo *q;
  255. int x = 0;
  256. if (feof(F) == NULL)
  257. {
  258. fscanf(F, "%d", &x);
  259. if (x == 0)
  260. return NULL;
  261. q = malloc(sizeof(drzewo));
  262. q->dana = x;
  263. q->rodzic = rodzic;
  264. q->lewy = dodaj_z_pliku(q->lewy, F, q);
  265. q->prawy = dodaj_z_pliku(q->prawy, F, q);
  266. return q;
  267. }
  268. }
  269.  
  270.  
  271. //************* zad 14
  272.  
  273. int SprawdzD(drzewo *T, drzewo *D)
  274. {
  275. if (T != NULL && D != NULL)
  276. {
  277. if (T->dana != D->dana)
  278. return 1;
  279.  
  280. else
  281. {
  282. SprawdzD(T->lewy, D->lewy);
  283. SprawdzD(T->prawy, D->prawy);
  284. return 0;
  285. }
  286. }
  287. }
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304. int main()
  305. {
  306.  
  307.  
  308. drzewo *z,*nast;
  309. int x,u,s,por;
  310.  
  311. printf("Podaj wartosc do drzewa \n");
  312. scanf("%d",&x);
  313. while(x!=0)
  314. {
  315. T=dodajD(T,x,0);
  316. printf("Podaj wartosc do drzewa \n");
  317. scanf("%d",&x);
  318. }
  319.  
  320.  
  321. drukowanieDrzewa(T,0,0);
  322.  
  323. znajdz_MAX(T);
  324. znajdz_MIN(T);
  325.  
  326. printf("Podaj jaki element chcesz wyszukac\n");
  327. scanf("%d",&s);
  328. z=szukanieD(T,s);
  329. if(z==0)
  330. {
  331. printf("Nie znaleziono\n\n");
  332. }
  333.  
  334.  
  335. else
  336. {
  337. nast=nastepnik(z);
  338. if(nast!=NULL)
  339. {
  340. printf("nastepnik %u wynosi %d \n",s,nast->dana);
  341. }
  342. }
  343.  
  344.  
  345. printf("Podaj jakie element chcesz usunac z drzewa\n");
  346. scanf("%d",&u);
  347.  
  348. T=usunD(T,u);
  349. drukowanieDrzewa(T,0,0);
  350.  
  351.  
  352. getchar();
  353. printf("\nChcesz zapisac drzewo do pliku txt");
  354. scanf("%c", &a);
  355. if (a == 'y')
  356. {
  357. F = fopen("drzewo.txt", "a");
  358. zapisz_do_pliku(T, F);
  359. fclose(F);
  360. }
  361.  
  362. F = fopen("drzewo.txt", "r");
  363.  
  364. if (F == NULL)
  365. {
  366. printf("\nPlik drzewo.txt nie istnieje!\n");
  367. return 1;
  368. }
  369. D = dodaj_z_pliku(T, F, T);
  370. fclose(F);
  371.  
  372. if (D != NULL)
  373. printf("drzewo z pliku: \n\n\n\n");
  374.  
  375.  
  376. drukowanieDrzewa(D,0,0);
  377.  
  378.  
  379.  
  380. por=SprawdzD(T,D);
  381. if(por!=1)
  382. printf("\n\nDrzewa Sa takie same");
  383.  
  384. return 0;
  385. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement