ItemRecord *__fastcall TNames::TreeSet(int *n, int d, int u) { // rekurencyjne wype³nianie drzewa pozycjami od (d) do (u) if (d == u) { rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL; return rRecords + n[d]; // tej ga³êzi nie ma } else if (d > u) return NULL; int p = (u + d) >> 1; // po³owa rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wczeœniejszych ga³êzi rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie póŸniejszych ga³êzi return rRecords + n[p]; };
void TNames::Sort(int t) { // przebudowa drzewa typu (t), zwraca wierzcho³ek drzewa if (iLast < 3) return; // jak jest ma³o, to nie ma sensu sortowaæ if (rTypes[t]) // jeœli jest jakiœ rekord danego typu { int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów int *q = r; // wskaŸnik roboczy, przekazywany przez referencjê rTypes[t]->ListGet(rRecords, q); // drzewo jest ju¿ posortowane - zamieniæ je na listê rTypes[t] = TreeSet(r, 0, (q - r) - 1); delete[] r; } return; };
static TreeSet newFull(){ return TreeSet(true); }
static TreeSet newEmpty(){ return TreeSet(); }