Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. /******************************************************************************
  2.  
  3. Online C Compiler.
  4. Code, Compile, Run and Debug C program online.
  5. Write your code in this editor and press "Run" button to compile and execute it.
  6.  
  7. *******************************************************************************/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #define N 2
  13. #define NN (N*2)
  14.  
  15.  
  16. struct Nod
  17. {
  18. char cheie[30];
  19. struct Pagina* p;
  20. int contor;
  21. };
  22. typedef struct Nod Nod;
  23.  
  24. struct Pagina
  25. {
  26. int m;
  27. struct Pagina* p0;
  28. Nod e[NN + 1];
  29. };
  30. typedef struct Pagina Pagina;
  31.  
  32. Nod v;
  33.  
  34. Pagina* insereaza(Pagina *pag, char *x, Nod *nod)
  35. {
  36. int i, s, d, mij;
  37. Pagina *q, *r;
  38.  
  39. if (!nod)
  40. {
  41. strcpy(v.cheie , x);
  42. v.contor = 1;
  43. v.p = NULL;
  44. }
  45. else
  46. v = *nod;
  47.  
  48. if (pag == NULL) //daca nu exista radacina
  49. {
  50. pag = (Pagina*)calloc(sizeof(Pagina), 1);
  51. pag->e[++pag->m] = v;
  52.  
  53. return pag;
  54. }
  55.  
  56. //se cauta binar pozitia cheii x in pagina curenta
  57. s = 1;
  58. d = pag->m;
  59. while (s <= d)
  60. {
  61. mij = (s + d) / 2;
  62. if (strcmp(pag->e[mij].cheie , x)==0) //gasit
  63. {
  64. pag->e[mij].contor++;
  65. return pag;
  66. }
  67. if (strcmp(x,pag->e[mij].cheie)<0)
  68. d = mij - 1;
  69. else
  70. s = mij + 1;
  71. }
  72.  
  73. //daca este pagina terminala sau daca se propaga insertia
  74. if (pag->p0 == NULL || nod)
  75. {
  76. if (pag->m < NN) //se poate adauga un nod in pagina curenta
  77. {
  78. ++pag->m;
  79. for (i = pag->m; i > d + 1; i--)
  80. pag->e[i] = pag->e[i - 1];
  81. pag->e[i] = v;
  82. }
  83. //pagina curenta pag este plina => supradepasire => pagina trebuie scindata
  84. else
  85. {
  86. Pagina *a = pag;
  87. Pagina *b = (Pagina*)calloc(sizeof(Pagina), 1);
  88. pag = (Pagina*)calloc(sizeof(Pagina), 1);
  89.  
  90. //scindarea paginii curente
  91. for (i = 1; i <= N; i++)
  92. b->e[i] = a->e[i + N];
  93. a->m = b->m = N;
  94.  
  95. //cheia noudului v e cheia de scindare
  96. if (strcmp(v.cheie , a->e[N].cheie) > 0 && strcmp(v.cheie , b->e[1].cheie)<0)
  97. pag->e[++pag->m] = v;
  98. else
  99. {
  100. //ultima cheie a nodului a este folosita la scindare
  101. if (strcmp(v.cheie , a->e[N].cheie)<0)
  102. {
  103. pag->e[++pag->m] = a->e[N];
  104. for (i = a->m; i > 1 && strcmp(a->e[i - 1].cheie , v.cheie)>0; i--)
  105. a->e[i] = a->e[i - 1];
  106. a->e[i] = v;
  107. }
  108. //prima cheie a nodului a este folosita la scindare
  109. else
  110. {
  111. pag->e[++pag->m] = b->e[1];
  112. for (i = 1; i < b->m && strcmp(b->e[i + 1].cheie , v.cheie)<0; i++)
  113. b->e[i] = b->e[i + 1];
  114. b->e[i] = v;
  115. }
  116. }
  117.  
  118. //se refac legaturile intre pagini
  119. b->p0 = pag->e[1].p; //prima legatura a paginii b devine legatura nodului parinte
  120. pag->p0 = a; //prima legatura a nodului parinte devine fostul vecin stanga
  121. pag->e[1].p = b; //a doua legatura a nodului parinte devine fostul vecin dreapta
  122. }
  123. }
  124. else
  125. {
  126. if (d == 0) //s-a ajuns la cel mai din stanga element => prima legatura
  127. q = pag->p0;
  128. else
  129. q = pag->e[d].p;
  130. r = insereaza(q, x, NULL);
  131. if (r != q) //daca pagina in care s-a inserat s-a scindat <=> arborele crescut cu un nivel
  132. {
  133. /*se incearca inserarea nodului din pagina scindata in pagina curenta
  134. in caz de succes, arborele nu va creste in inaltime*/
  135. pag = insereaza(pag, r->e[1].cheie, &r->e[1]);
  136. free(r); //se sterge pagina scindata, intrucat nodul a fost inserat intr-o alta pagina
  137. }
  138. }
  139.  
  140. return pag;
  141. }
  142.  
  143. void afisare(Pagina *arbore, int nivel)
  144. {
  145. int i;
  146.  
  147. if (!arbore)
  148. return;
  149.  
  150. //printf("Nivel %d: ", nivel);
  151. for (i = 1; i <= arbore->m; i++)//afisarea paginii
  152. printf("%s ", arbore->e[i].cheie);
  153. //printf("\n");
  154.  
  155. afisare(arbore->p0, nivel + 1);//afisarea prima pagina fiu
  156.  
  157. for (i = 1; i <= arbore->m; i++)//afisarea restul paginilor fiu
  158. afisare(arbore->e[i].p, nivel + 1);
  159.  
  160.  
  161.  
  162. }
  163.  
  164. Pagina *radacina = NULL;
  165.  
  166. int main()
  167. {
  168. char sir[30];
  169. int n;
  170. printf("Care este n? ");
  171. scanf("%d",&n);
  172. for(int i=0;i<n;i++){
  173. printf("Siruri introduse:%d/%d. Introduceti Sir: ",i,n);
  174. scanf("%s",sir);//citire
  175. radacina=insereaza(radacina,sir,NULL);}
  176. printf("rezultat: ");
  177. afisare(radacina,1);
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement