]>
Piment Noir Git Repositories - Algorithmic_C.git/blob - TP6/arbres/arbreB/arbreB.c
156771838b435b26afe014e7dc300ac6242d047d
1 /*****************************************************************************/
3 /* Insertion dans un B-arbre d'ordre 2 */
4 /*****************************************************************************/
8 /* declarations des types C pour definir les B-arbres d'ordre 2 */
11 /* ordre du B-arbre */
14 /* les cles sont des entiers */
17 t_cle cle
[2 * ORDRE
+ 1];
18 struct page
*fils
[2 * ORDRE
+ 1];
21 /* une page contient au maximum 2*ORDRE cles et a 2*ORDRE+1 fils.
22 cle[0] contient le nombre de cles contenues dans la page.
23 ces cles sont rangees dans le tableau cle[1..2*ORDRE] */
26 /*****************************************************************************/
27 /* affichage d'un B-arbre */
28 void affiche_B_arbre(PAGE
* p
, int l
)
33 for (i
= 1; i
<= l
; i
++)
35 for (i
= 1; i
<= p
->cle
[0]; i
++)
36 printf("%6d", p
->cle
[i
]);
38 for (i
= 0; i
<= p
->cle
[0]; i
++)
39 affiche_B_arbre(p
->fils
[i
], l
+ 4);
44 /*****************************************************************************/
45 /* insertion de la cle x dans le B-arbre de racine a - v et pv designent
46 l'element (cle+pointeur) qui remonte au niveau superieur */
47 int insertion(t_cle x
, PAGE
* a
, t_cle
* v
, PAGE
** pv
)
49 int h
= 0, gauche
, droit
, milieu
, i
, m
;
57 } else { /* recherche dichotomique */
61 milieu
= (gauche
+ droit
) / 2;
62 if (x
<= a
->cle
[milieu
])
64 if (x
>= a
->cle
[milieu
])
66 } while (gauche
<= droit
);
67 if (gauche
- droit
== 2) /* on a trouve x - on ne fait rien */
69 else { /* x n'est pas sur cette page */
70 h
= insertion(x
, a
->fils
[droit
], &u
, &pu
);
71 if (h
) { /* insertion de u en position droit+1 */
76 for (i
= m
; i
>= droit
+ 2; i
--) { /* decalage */
77 a
->cle
[i
] = a
->cle
[i
- 1];
78 a
->fils
[i
] = a
->fils
[i
- 1];
80 a
->cle
[droit
+ 1] = u
; /* insertion */
81 a
->fils
[droit
+ 1] = pu
;
83 } else { /* la page est pleine - on la coupe en deux */
84 b
= (PAGE
*) malloc(sizeof(PAGE
));
86 printf("Erreur allocation!\n");
89 if (droit
<= ORDRE
) { /* insertion de u dans la page de gauche ie dans a */
96 for (i
= ORDRE
; i
>= droit
+ 2; i
--) { /* decalage */
97 a
->cle
[i
] = a
->cle
[i
- 1];
98 a
->fils
[i
] = a
->fils
[i
- 1];
100 a
->cle
[droit
+ 1] = u
; /* insertion du u dans a */
101 a
->fils
[droit
+ 1] = pu
;
103 for (i
= 1; i
<= ORDRE
; i
++) {
104 b
->cle
[i
] = a
->cle
[i
+ ORDRE
];
105 b
->fils
[i
] = a
->fils
[i
+ ORDRE
];
107 } else { /* insertion dans la page droite */
108 droit
= droit
- ORDRE
;
109 *v
= a
->cle
[ORDRE
+ 1];
110 *pv
= a
->fils
[ORDRE
+ 1];
111 for (i
= 1; i
<= droit
- 1; i
++) {
112 b
->cle
[i
] = a
->cle
[i
+ ORDRE
+ 1];
113 b
->fils
[i
] = a
->fils
[i
+ ORDRE
+ 1];
115 b
->cle
[droit
] = u
; /* insertion de u dans b */
117 for (i
= droit
+ 1; i
<= ORDRE
; i
++) {
118 b
->cle
[i
] = a
->cle
[i
+ ORDRE
];
119 b
->fils
[i
] = a
->fils
[i
+ ORDRE
];
122 a
->cle
[0] = b
->cle
[0] = ORDRE
;
133 /*****************************************************************************/
136 PAGE
*rac
= NULL
, *pu
, *q
;
140 printf("Entrez une cle: ");
143 printf("Insertion de la cle %6d\n", x
);
144 h
= insertion(x
, rac
, &u
, &pu
);
147 rac
= (PAGE
*) malloc(sizeof(PAGE
));
149 printf("Erreur allocation!\n");
157 affiche_B_arbre(rac
, 1);
163 /*****************************************************************************/