Advertisement
Guest User

Untitled

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