Advertisement
Guest User

Untitled

a guest
Jun 2nd, 2015
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.41 KB | None | 0 0
  1. // struktura wezla B-drzewa i przyklad zapisu i odczytu na plik
  2. // budowanie B-drzewa o zadanej wysokosci i drukowanie
  3.  
  4. #include <stdio.h>
  5. #define T 3
  6.  
  7. typedef struct
  8. {
  9. short n;
  10. short leaf;
  11. int k[2*T-1];
  12. int c[2*T];
  13. int info[2*T-1];
  14. } Wezel;
  15.  
  16. int rozmiarw = sizeof(Wezel);
  17. FILE *drzewo;
  18.  
  19. void zapisz(int i,Wezel *w)
  20. {
  21. fseek(drzewo,(long)i*rozmiarw,SEEK_SET);
  22. fwrite(w,rozmiarw,1,drzewo);
  23. }
  24.  
  25. void odczytaj(int i,Wezel *w)
  26. {
  27. fseek(drzewo,(long)i*rozmiarw,SEEK_SET);
  28. fread(w,rozmiarw,1,drzewo);
  29. }
  30.  
  31. void usun(int i)
  32. {
  33. Wezel w;
  34. odczytaj(i,&w);
  35. w.n=-1;
  36. zapisz(i,&w);
  37. }
  38.  
  39. int budujB(int g, int n)
  40. {
  41. static int klucz=0;
  42. static int pozycja=0;
  43. Wezel w;
  44. w.n=n;
  45. int i;
  46. if (g==0)
  47. {
  48. for (i=0;i<n;i++)
  49. {
  50. w.c[i]= -1;
  51. w.k[i]= klucz++;
  52. }
  53. w.c[n]= -1;
  54. w.leaf=1;
  55. }
  56. else
  57. {
  58. for (i=0;i<n;i++)
  59. {
  60. w.c[i]= budujB(g-1,n);
  61. w.k[i]= klucz++;
  62. }
  63. w.c[n]= budujB(g-1,n);;
  64. w.leaf=0;
  65. }
  66. zapisz(pozycja++,&w);
  67. return pozycja-1;
  68. }
  69.  
  70. drukujB(int r, int p)
  71. {
  72. Wezel w;
  73. int i,j;
  74. odczytaj(r,&w);
  75. if (w.leaf)
  76. {
  77. for (i=0;i<p;i++) printf(" ");
  78. for (i=0;i<w.n;i++) printf("%d ",w.k[i]);
  79. printf("\n");
  80. }
  81. else
  82. {
  83. drukujB(w.c[w.n],p+4);
  84. for (i=w.n-1;i>=0;i--)
  85. {
  86. for (j=0;j<p;j++) printf(" ");
  87. printf("%d\n",w.k[i]);
  88. drukujB(w.c[i],p+4);
  89. }
  90. }
  91. }
  92.  
  93. int rozbij(int r, int t, int s)
  94. {
  95. Wezel w1,w2,w3,pm;
  96. int i, j=0, k;
  97. odczytaj(s, &w1);
  98. odczytaj(t, &w2);
  99. w3.leaf=w1.leaf;
  100. w3.n=(2*T-1)/2;
  101. while(w2.k[j]<w1.k[w3.n] && j<w2.n)
  102. j++;;
  103. for(i=0; i<w3.n; i++)
  104. w3.k[i]=w1.k[i+w3.n+1];
  105. if(w1.leaf==0)
  106. for(i=0; i<w3.n+1; i++)
  107. w3.c[i]=w1.c[i+w3.n+1]+1;
  108. else
  109. for(i=0; i<w3.n+1; i++)
  110. w3.c[i]=-1;
  111. w3.leaf=w1.leaf;
  112. w3.n=(2*T-1)/2;
  113. w1.n=w3.n;
  114. for(i=w2.n; i>j; i--)
  115. w2.k[i]=w2.k[i-1];
  116. for(i=w2.n+1; i>j; i--)
  117. w2.c[i]=w2.c[i-1]+1;
  118. w2.c[j]=s;
  119. w2.k[j]=w1.k[w3.n];
  120. w2.n++;
  121. for(i=r; i>s; i--)
  122. {
  123. odczytaj(i, &pm);
  124. for(k=pm.n+1; k>=0; k--)
  125. if(pm.c[k]>s && pm.leaf==0)
  126. pm.c[k]++;
  127. zapisz(i+1, &pm);
  128. }
  129. zapisz(s, &w1);
  130. odczytaj(s, &w1);
  131. zapisz(s+1, &w3);
  132. zapisz(t+1, &w2);
  133. r++;
  134. return r;
  135. }
  136.  
  137. szukaj(int r, int l)
  138. {
  139. Wezel w;
  140. odczytaj(r,&w);
  141. int inf=0, i=0;
  142. while(inf==0)
  143. {
  144. i=0;
  145. while(w.k[i]<l && i<w.n)
  146. i++;
  147. if(w.k[i]==l)
  148. inf=1;
  149. else if(w.leaf==0)
  150. odczytaj(w.c[i],&w);
  151. else
  152. inf=2;
  153. }
  154. if(inf==1)
  155. printf("Element %i znajduje sie w drzewie.\n", l);
  156. else
  157. printf("Element %i nie znajduje sie w drzewie.\n", l);
  158. }
  159.  
  160. int wstaw(int r, int l)
  161. {
  162. Wezel w;
  163. odczytaj(r,&w);
  164. int i=0, j=0, k;
  165. while(w.leaf==0)
  166. {
  167. i=0;
  168. while(w.k[i]<l && i<w.n)
  169. i++;
  170. k=j;
  171. j=w.c[i];
  172. odczytaj(j,&w);
  173. }
  174. i=0;
  175. if(w.n==2*T-1)
  176. {
  177. r=rozbij(r, k, j);
  178. odczytaj(k, &w);
  179. int k2=k+1;
  180. while(w.n==2*T-1)
  181. {
  182. while(j!=k)
  183. {
  184. i=0;
  185. while(w.k[i]<l && i<w.n)
  186. i++;
  187. k2=j;
  188. j=w.c[i];
  189. odczytaj(j,&w);
  190. }
  191. k=k2;
  192. r=rozbij(r, k, j);
  193. odczytaj(k, &w);
  194. }
  195. j+=1;
  196. odczytaj(j,&w);
  197. if(w.k[0]>l)
  198. {
  199. j--;
  200. odczytaj(j,&w);
  201. }
  202. }
  203. while(w.k[i]<l && i<w.n)
  204. i++;
  205. if(i==w.n)
  206. {
  207. w.k[w.n]=l;
  208. w.n++;
  209. zapisz(j,&w);
  210. }
  211. else
  212. {
  213. k=w.n;
  214. while(w.k[k-1]!=w.k[i])
  215. {
  216. w.k[k]=w.k[k-1];
  217. k--;
  218. }
  219. while(w.k[k-1]==w.k[i])
  220. {
  221. w.k[k]=w.k[i];
  222. k--;
  223. }
  224. w.k[k]=l;
  225. w.n++;
  226. zapisz(j,&w);
  227. }
  228. return r;
  229. }
  230.  
  231. main()
  232. {
  233. int i;
  234. drzewo = fopen("bdrzewo","w+");
  235. int root;
  236. root=budujB(2,2);
  237. printf("\n");
  238. drukujB(root,0);
  239. printf("\n");
  240. szukaj(root, 2);
  241. szukaj(root, 12);
  242. szukaj(root, 25);
  243. szukaj(root, 26);
  244. szukaj(root, 122);
  245. root=wstaw(root, -22);
  246. root=wstaw(root, -10);
  247. root=wstaw(root, 2);
  248. root=wstaw(root, -2);
  249. root=wstaw(root, 6);
  250. root=wstaw(root, 17);
  251. root=wstaw(root, 17);
  252. root=wstaw(root, 17);
  253. root=wstaw(root, 17);
  254. root=wstaw(root, 123);
  255. root=wstaw(root, 200);
  256. root=wstaw(root, 201);
  257. root=wstaw(root, 202);
  258. printf("\n");
  259. printf("WSTAWIANIE\n");
  260. drukujB(root,0);
  261. printf("\n");
  262. szukaj(root, -22);
  263. szukaj(root, -8);
  264. szukaj(root, 0);
  265. szukaj(root, 111);
  266. szukaj(root, 123);
  267. fclose(drzewo);
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement