Advertisement
Guest User

Untitled

a guest
Aug 19th, 2016
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.44 KB | None | 0 0
  1.  
  2. #define PT0(P) (*(struct avlt_node**)((uintp)(P) + soff[1 + vi]))
  3. #define PT1(P) (*(struct avlt_node**)((uintp)(P) + soff[1 - vi]))
  4.  
  5. #define SB0(P) sb[3 + vi*3 + 1 + (P)->vb]
  6. #define SB1(P) sb[3 - vi*3 + 1 + (P)->vb]
  7.  
  8.  
  9. struct avlt_node* fu_avltbalance_(struct avlt_node *pc, int vi) {
  10.  
  11.   const static uintp soff[3] = { (uintp)( &((struct avlt_node*)0)->pl), 0,
  12.                                  (uintp)( &((struct avlt_node*)0)->pr) };
  13.  
  14.   const static int   sb[9] = { 0, 0,-1,  0, 0, 0,  1, 0, 0 };
  15.  
  16.   struct avlt_node *p0, *p1;
  17.  
  18.  
  19.   if (PT0(pc)->vb == -vi) {
  20.  
  21.     p0 = PT0(pc);
  22.     p1 = PT1(PT0(pc));
  23.     PT0(pc) = PT1(p1);
  24.     PT1(p0) = PT0(p1);
  25.     PT1(p1) = pc;
  26.     PT0(p1) = p0;
  27.  
  28.     pc->vb = SB1(p1);
  29.     p0->vb = SB0(p1);
  30.     p1->vb = 0;
  31.  
  32.   } else {
  33.     /*  PT0(pc)->vb == vi */
  34.  
  35.     p1 = PT0(pc);
  36.     PT0(pc) = PT1(p1);
  37.     PT1(p1) = pc;
  38.  
  39.     pc->vb = 0;
  40.     p1->vb = 0;
  41.   }
  42.  
  43.   return p1;
  44. }
  45.  
  46. #undef PT0
  47. #undef PT1
  48. #undef SB0
  49. #undef SB1
  50.  
  51.  
  52.  
  53. void fuavlt_add(struct avlt_head *ph, struct avlt_node *pn) {
  54.  
  55.   const static uintp soff[3] = { (uintp)( &((struct avlt_node*)0)->pl), 0,
  56.                                  (uintp)( &((struct avlt_node*)0)->pr) };
  57.  
  58.   struct avlt_node*  stn[46]; /* буфера обеспечения возврата */
  59.   int8               std[46];
  60.   struct avlt_node *pc, *p0, **px;
  61.   uint32 va;
  62.  
  63.   assert(ph != NULL);
  64.   assert(pn != NULL);  
  65.  
  66.  
  67.  
  68.   pn->vb = 0;
  69.   pn->pr = NULL;
  70.   pn->pl = NULL;
  71.  
  72.  
  73.  
  74.   if (ph->pt == NULL) {
  75.  
  76.     ph->pt = pn;
  77.     return;
  78.   }
  79.  
  80.  
  81.   for (pc = ph->pt, va = 0; ; va++) {
  82.    
  83.     if (pn->vk < pc->vk) { std[va] = -1;
  84.     } else {               std[va] =  1;
  85.     }
  86.       /* (void**) */
  87.     px = (void*)((uintp)pc+soff[1 + std[va]]);
  88.  
  89.     if (*px == NULL) {
  90.      
  91.       *px = pn; break;
  92.     }
  93.  
  94.     stn[va] = pc;
  95.     pc = *px;
  96.   }
  97.  
  98.  
  99.   for ( ; ; pc = stn[--va]) {
  100.  
  101.     if ((pc->vb += std[va]) == 0) {
  102.       break;
  103.     }
  104.    
  105.     if (pc->vb ==  2) {
  106.      
  107.       p0 = fu_avltbalance_(pc, 1);
  108.      
  109.       if (va == 0) { ph->pt = p0;        
  110.       } else {
  111.         *(void**)((uintp)stn[va-1] + soff[1 + std[va - 1]]) = p0;
  112.       }
  113.       break;
  114.  
  115.     } else
  116.     if (pc->vb == -2) {
  117.  
  118.       p0 = fu_avltbalance_(pc, -1);
  119.  
  120.       if (va == 0) { ph->pt = p0;        
  121.       } else {
  122.         *(void**)((uintp)stn[va-1] + soff[1 + std[va - 1]]) = p0;
  123.       }
  124.       break;
  125.     }
  126.  
  127.     if (va == 0) { break; }
  128.   }
  129.  
  130.   return;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement