123 template <
typename T>
125 return root ==
nullptr;
128 template <
typename T>
133 template <
typename T>
147 n->leftlink =
nullptr;
148 n->rightlink =
nullptr;
167 temp =
next->rightlink;
168 if (temp ==
nullptr) {
169 left->rightlink =
next;
171 right->leftlink =
nullptr;
176 if (temp->key -
key > 0) {
177 left->rightlink =
next;
184 next->rightlink = temp->leftlink;
185 if (temp->leftlink !=
nullptr) {
186 temp->leftlink->uplink =
next;
188 left->rightlink = temp;
190 temp->leftlink =
next;
193 next = temp->rightlink;
194 if (
next ==
nullptr) {
195 right->leftlink =
nullptr;
201 }
while (
next->key -
key <= 0);
206 temp =
next->leftlink;
207 if (temp ==
nullptr) {
208 right->leftlink =
next;
209 next->uplink = right;
210 left->rightlink =
nullptr;
215 if (temp->key -
key <= 0) {
216 right->leftlink =
next;
217 next->uplink = right;
222 next->leftlink = temp->rightlink;
223 if (temp->rightlink !=
nullptr) {
224 temp->rightlink->uplink =
next;
226 right->leftlink = temp;
227 temp->uplink = right;
228 temp->rightlink =
next;
231 next = temp->leftlink;
232 if (
next ==
nullptr) {
233 left->rightlink =
nullptr;
245 n->leftlink =
n->rightlink;
250 template <
typename T>
252 return dequeue(&
root);
255 template <
typename T>
264 if (
np ==
nullptr || *
np ==
nullptr) {
268 left =
next->leftlink;
269 if (left ==
nullptr) {
273 if (*
np !=
nullptr) {
274 (*np)->uplink =
nullptr;
280 farleft = left->leftlink;
281 if (farleft ==
nullptr) {
283 next->leftlink = left->rightlink;
284 if (left->rightlink !=
nullptr)
285 left->rightlink->uplink =
next;
290 farfarleft = farleft->leftlink;
291 if (farfarleft ==
nullptr) {
293 left->leftlink = farleft->rightlink;
294 if (farleft->rightlink !=
nullptr)
295 farleft->rightlink->uplink = left;
300 next->leftlink = farleft;
301 farleft->uplink =
next;
302 left->leftlink = farleft->rightlink;
303 if (farleft->rightlink !=
nullptr)
304 farleft->rightlink->uplink = left;
305 farleft->rightlink = left;
306 left->uplink = farleft;
316 template <
typename T>
327 right =
n->rightlink;
331 while (up !=
nullptr) {
335 if (up->leftlink ==
prev)
337 if (upup !=
nullptr && upup->leftlink == up)
339 upupup = upup->uplink;
340 upup->leftlink = up->rightlink;
341 if (upup->leftlink !=
nullptr) {
342 upup->leftlink->uplink = upup;
344 up->rightlink = upup;
346 if (upupup ==
nullptr) {
348 }
else if (upupup->leftlink == upup) {
349 upupup->leftlink = up;
351 upupup->rightlink = up;
356 up->leftlink = right;
357 if (right !=
nullptr) {
364 if (upup !=
nullptr && upup->rightlink == up)
366 upupup = upup->uplink;
367 upup->rightlink = up->leftlink;
368 if (upup->rightlink !=
nullptr) {
369 upup->rightlink->uplink = upup;
373 if (upupup ==
nullptr) {
375 }
else if (upupup->rightlink == upup) {
376 upupup->rightlink = up;
378 upupup->leftlink = up;
383 up->rightlink = left;
384 if (left !=
nullptr) {
401 n->rightlink = right;
402 if (left !=
nullptr) {
405 if (right !=
nullptr) {
412 template <
typename T>
420 x->leftlink =
nullptr;
422 if (
root !=
nullptr) {
430 template <
typename T>
433 T* x = dequeue(&
root->rightlink);
438 root->uplink =
nullptr;
443 x->leftlink =
root->leftlink;
444 x->rightlink =
root->rightlink;
445 if (x->leftlink !=
nullptr) {
446 x->leftlink->uplink = x;
448 if (x->rightlink !=
nullptr) {
449 x->rightlink->uplink = x;
455 template <
typename T>
458 while (
n &&
key !=
n->key) {
459 n =
key <
n->key ?
n->leftlink :
n->rightlink;
470 template <
typename T>
472 for (T* x =
n !=
nullptr ?
n : fast_first(); x !=
nullptr; x = fast_next(x)) {
473 std::invoke(f, x, 0);
477 template <
typename T>
484 while (x->leftlink !=
nullptr) {
490 template <
typename T>
498 if (T* x =
n->rightlink; x !=
nullptr) {
499 while (x->leftlink !=
nullptr) {
508 while (x !=
nullptr) {
509 if (x->leftlink ==
n) {
void apply_all(void(*f)(const T *, int), T *n) const
T * fast_next(T *n) const
int const size_t const size_t n
static double done(void *v)