witam,
mam problem z dodawaniem elementu i dzieleniem w bdrzewie, mianowicie za każdym razem kiedy dodaje element do węzła q, wywołuje funkcję dzielenia podziel(q). Funkcja sprawdza czy liczba elementów w węźle osiągnęła maksymalną i jeśli tak to wykonuje dzielenie.
Tworzy 2 nowe węzły l i r i przepisuje po połowie elementów z węzła q do każdego z nich, przepina również wskaźniki z tablicy wskaźników. Dalej funkcja sprawdza czy węzeł jest rootem (pomijam tak, gdyż tutaj wszystko wydaje się być ok), natomiast jeśli nie (tutaj kluczowa kwestia), dla klucza p wywołuje funkcję dodaj(p,q->parent). dodaj(p,q) zwraca indeks elementu który wstawiliśmy, możemy wtedy ustawić konkretny wskaźnik na l i na r.

Problem w tym, że kiedy wykonuje test składający się z:

 
4
5
2
7
8
1
3

(dla t=2, zatem max liczba elementów w węźle 2t-1 = 3), kiedy wstawiam ostatni element (3) węzeł zawiera elementy q1={1,2,3} natomiast rodzic zawiera elementy root={4,7}.
{2} wstawiana jest do roota {2,4,7} i ponownie wywoływana funkcja podziel. efekt jest taki ze rootem jest {4} zaś wskażniki wsk od 0 do max+1 kolejno pokazują elementy: {1},{3},{5},{8}.
W akcji zaginęły jescze niedawno bracia 4: 2 i 7;
szczerze mówiąc zamotałem się i Was również zatem wstawiam kod i proszę o pomoc:

 

int podziel(wezel *q){
	if(q->n == q->max){

	 wezel *l = new wezel((q->max+1)/2);
	 wezel *r = new wezel((q->max+1)/2);

	 l->leaf = true; l->max = q->max; l->n = l->max/2;
	 r->leaf = true; r->max = q->max; r->n = r->max/2;

	 for(int i=0;i<q->max/2;i++){
	         l->key[i] = q->key[i];
	         r->key[i] = q->key[q->max/2+1+i];
			 }


				for(int i=0;i<q->max/2+1;i++){
						l->wsk[i] = q->wsk[i];
						r->wsk[i] = q->wsk[q->max/2+1+i];
				}
	 if(q->parent == NULL){
				  q->key[0] = q->key[(q->max)/2];
				  q->wsk[0] = l; q->wsk[1] = r;
				  q->n = 1;
				  q->leaf = false;
				  l->parent = q;
				  r->parent = q;
				  return 0;
     }
	 else {
		  klucz *p = new klucz;
		  p->pesel = q->key[q->max/2].pesel;
		  p->imie = q->key[q->max/2].imie;
          p->nazw = q->key[q->max/2].nazw;

          int i = dodaj(p,q->parent);
          q->parent->wsk[i] = l;
          q->parent->wsk[i+1] = r;
          return 1;

	 }
}
else return 0;
}
int dodaj(klucz *p,wezel *q){
	 int i=0;
	 for(i=0;i<q->n;i++){
			 if(q->key[i].pesel > p->pesel) {przesun(q,i);break;}
    		 }
 		 q->key[i]=*p;
    	 q->n++;
    	 int k=podziel(q);
    	 if(k == 1) podziel(q->parent);
    	 return i;
}
}