亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? r2btree.c

?? 這是一個(gè)C程序分析工具
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
	  q->parent = r;
	  /* now a left rotation around p */
	  p->right = r->left;
	  if (r->left) {
	    r->left->parent = p;
	  }
	  r->left = p;
	  p->parent = r;
	  SET_RANK (q, (GET_RANK (q) - GET_RANK (r)));
	  SET_RANK (r, (GET_RANK (r) + GET_RANK (p)));	    
	}
	if (GET_BALANCE (r) == shortened_side) {
	  SET_BALANCE (q, (- shortened_side));
	  SET_BALANCE (p, 0);
	} else if (GET_BALANCE (r) == (- shortened_side)) {
	  SET_BALANCE (q, 0);
	  SET_BALANCE (p, shortened_side);
	} else {
	  SET_BALANCE (q, 0);
	  SET_BALANCE (p, 0);
	}
	SET_BALANCE (r, 0);
	q = r;
      }
      /* a rotation has caused <q> (or <r> in case 3c) to become
       * the root.  let <p>'s former parent know this.
       */
      if (top->left == p) {
	top->left = q;
      } else {
	top->right = q;
      }
      /* end case 3 */
      p = q;
    }
    x = p;
    p = x->parent;
    /* shortened_side tells us which side we came up from */
    if (x == p->left) {
      shortened_side = -1;
    } else {
      shortened_side = +1;
    }
  } /* end while(shorter) */
  /* when we're all done, we're one shorter */
  tree->length = tree->length - 1;
  return (0);
}

int
iterate_inorder_helper (avl_node * node,
			avl_iter_fun_type iter_fun,
			void * iter_arg)
{
  int result;
  if (node->left) {
    result = iterate_inorder_helper (node->left, iter_fun, iter_arg);
    if (result != 0) {
      return result;
    }
  }
  result = (iter_fun (node->key, iter_arg));
  if (result != 0) {
    return result;
  }
  if (node->right) {
    result = iterate_inorder_helper (node->right, iter_fun, iter_arg);
    if (result != 0) {
      return result;
    }
  }
  return 0;
}

int
iterate_inorder (avl_tree * tree,
		 avl_iter_fun_type iter_fun,
		 void * iter_arg)
{
  int result;

  if (tree->length) {
    result = iterate_inorder_helper (tree->root->right, iter_fun, iter_arg);
    return (result);
  } else {
    return 0;
  }
}

avl_node *
get_predecessor (avl_node * node)
{
  if (node->left) {
    node = node->left;
    while (node->right) {
      node = node->right;
    }
    return node;
  } else {
    avl_node * child = node;
    while (node->parent) {
      node = node->parent;
      if (child == node->right) {
	return node;
      }
      child = node;
    }
    return node;
  }
}

avl_node *
get_successor (avl_node * node)
{
  if (node->right) {
    node = node->right;
    while (node->left) {
      node = node->left;
    }
    return node;
  } else {
    avl_node * child = node;
    while (node->parent) {
      node = node->parent;
      if (child == node->left) {
	return node;
      }
      child = node;
    }
    return node;
  }
}

avl_node *
get_first_node(avl_tree *tree)
{
  avl_node *ptr=tree->root->right;

  if (ptr==NULL)
    return (avl_node *)NULL;

  while (ptr->left!=NULL)
    ptr=ptr->left;

  return ptr;
}

/* iterate a function over a range of indices, using get_predecessor */

int
iterate_index_range (avl_tree * tree,
		     avl_iter_index_fun_type iter_fun,
		     unsigned long low,
		     unsigned long high,
		     void * iter_arg)
{
  unsigned long m;
  unsigned long num_left;
  avl_node * node;

  if (high > tree->length) {
    return -1;
  }
  num_left = (high - low);
  /* find the <high-1>th node */
  m = high;
  node = tree->root->right;
  while (1) {
    if (m < GET_RANK (node)) {
      node = node->left;
    } else if (m > GET_RANK (node)) {
      m = m - GET_RANK (node);
      node = node->right;
    } else {
      break;
    }
  }
  /* call <iter_fun> on <node>, <get_pred(node)>, ... */
  while (num_left) {
    num_left = num_left - 1;
    if (iter_fun (num_left, node->key, iter_arg) != 0) {
      return -1;
    }
    node = get_predecessor (node);
  }
  return 0;
}

/* If <key> is present in the tree, return that key's node, and set <*index>
 * appropriately.  If not, return NULL, and set <*index> to the position
 * representing the closest preceding value.
 */

avl_node *
get_index_by_key (avl_tree * tree,
		  void * key,
		  unsigned long * index)
{
  avl_node * x = tree->root->right;
  unsigned long m = GET_RANK (x);

  while (1) {
    int compare_result = tree->compare_fun (tree->compare_arg, key, x->key);
    if (compare_result < 0) {
      if (x->left) {
	m = m - GET_RANK(x);
	x = x->left;
	m = m + GET_RANK(x);
      } else {
	*index = m - 2;
	return NULL;
      }
    } else if (compare_result > 0) {
      if (x->right) {
	x = x->right;
	m = m + GET_RANK(x);
      } else {
	*index = m - 1;
	return NULL;
      }
    } else {
      *index = m - 1;
      return x;
    }
  }
}

/* return the (low index, high index) pair that spans the given key */

int
get_span_by_key (avl_tree * tree,
		 void * key,
		 unsigned long * low,
		 unsigned long * high)
{
  unsigned long m, i, j;
  avl_node * node;

  node = get_index_by_key (tree, key, &m);

  /* did we find an exact match?
   * if so, we have to search left and right
   * to find the span, since we know nothing about
   * the arrangement of like keys.
   */
  if (node) {
    avl_node * left, * right;
    /* search left */
    left = get_predecessor (node);
    i = m;
    while ((i > 0) && (tree->compare_fun (tree->compare_arg, key, left->key) == 0)) {
      left = get_predecessor (left);
      i = i - 1;
    }
    /* search right */
    right = get_successor (node);
    j = m;
    while ((j <= tree->length) && (tree->compare_fun (tree->compare_arg, key, right->key) == 0)) {
      right = get_successor (right);
      j = j + 1;
    }
    *low = i;
    *high = j + 1;
    return 0;
  } else {
    *low = *high = m;
  }
  return 0;
}

/* return the (low index, high index) pair that spans the given key */

int
get_span_by_two_keys (avl_tree * tree,
		      void * low_key,
		      void * high_key,
		      unsigned long * low,
		      unsigned long * high)
{
  unsigned long i, j;
  avl_node * low_node, * high_node;
  int order;

  /* we may need to swap them */
  order = tree->compare_fun (tree->compare_arg, low_key, high_key);
  if (order > 0) {
    void * temp = low_key;
    low_key = high_key;
    high_key = temp;
  }

  low_node = get_index_by_key (tree, low_key, &i);
  high_node = get_index_by_key (tree, high_key, &j);

  if (low_node) {
    avl_node * left;
    /* search left */
    left = get_predecessor (low_node);
    while ((i > 0) && (tree->compare_fun (tree->compare_arg, low_key, left->key) == 0)) {
      left = get_predecessor (left);
      i = i - 1;
    }
  } else {
    i = i + 1;
  }
  if (high_node) {
    avl_node * right;
    /* search right */
    right = get_successor (high_node);
    while ((j <= tree->length) && (tree->compare_fun (tree->compare_arg, high_key, right->key) == 0)) {
      right = get_successor (right);
      j = j + 1;
    }
  } else {
    j = j + 1;
  }

  *low = i;
  *high = j;
  return 0;
}

		   
int
get_item_by_key_most (avl_tree * tree,
		      void * key,
		      void **value_address)
{
  avl_node * x = tree->root->right;
  *value_address = NULL;

  while (1) {
    int compare_result = tree->compare_fun (tree->compare_arg, key, x->key);

    if (compare_result == 0) {
      *value_address = x->key;
      return 0;
    } else if (compare_result < 0) {
      /* the given key is less than the current key */
      if (x->left) {
	x = x->left;
      } else {
	if (*value_address) 
	  return 0;
	else
	  return -1;
      }
    } else {
      /* the given key is more than the current key */
      /* save this value, it might end up being the right one! */
      *value_address = x->key;
      if (x->right) {
	/* there is a bigger entry */
	x = x->right;
      } else {
	if (*value_address) 
	  return 0;
	else
	  return -1;
      }
    }
  }
}

int
get_item_by_key_least (avl_tree * tree,
		       void * key,
		       void **value_address)
{
  avl_node * x = tree->root->right;
  *value_address = NULL;

  while (1) {
    int compare_result = tree->compare_fun (tree->compare_arg, key, x->key);
    if (compare_result == 0) {
      *value_address = x->key;
      return 0;  /* exact match */
    } else if (compare_result < 0) {
      /* the given key is less than the current key */
      /* save this value, it might end up being the right one! */
      *value_address = x->key;
      if (x->left) {
	x = x->left;
      } else {
	if (*value_address)  /* we have found a valid entry */
	  return 0; 
	else
	  return -1;
      }
    } else {
      if (x->right) {
	/* there is a bigger entry */
	x = x->right;
      } else {
	if (*value_address)  /* we have found a valid entry */
	  return 0; 
	else
	  return -1;
      }
    }
  }
}

#define MAX(X, Y)  ((X) > (Y) ? (X) : (Y))

long
verify_balance (avl_node * node)
{
  if (!node) {
    return 0;
  } else {
    long lh = verify_balance (node->left);
    long rh = verify_balance (node->right);
    if ((rh - lh) != GET_BALANCE(node)) {
      fprintf (stderr, "invalid balance at node %d\n", (int) node->key);
    }
    if (((lh - rh) > 1) || ((lh - rh) < -1)) {
      fprintf (stderr, "unbalanced at node %d\n", (int) node->key);
    }
    return (1 + MAX (lh, rh));
  }
}

void
verify_parent (avl_node * node, avl_node * parent)
{
  if (node->parent != parent) {
    fprintf (stderr, "invalid parent at node %d\n", (int) node->key);
  }
  if (node->left) {
    verify_parent (node->left, node);
  }
  if (node->right) {
    verify_parent (node->right, node);
  }
}

long
verify_rank (avl_node * node)
{
  if (!node) {
    return 0;
  } else {
    unsigned long num_left=0, num_right=0;
    if (node->left) {
      num_left = verify_rank (node->left);
    }
    if (node->right) {
      num_right = verify_rank (node->right);
    }
    if (GET_RANK (node) != num_left + 1) {
      fprintf (stderr, "invalid rank at node %d\n", (int) node->key);
    }
    return (num_left + num_right + 1);
  }
}

/* sanity-check the tree */

int
verify (avl_tree * tree)
{
  if (tree->length) {
    verify_balance (tree->root->right);
    verify_parent  (tree->root->right, tree->root);
    verify_rank    (tree->root->right);
  }
  return (0);
}

/*
 * These structures are accumulated on the stack during print_tree
 * and are used to keep track of the width and direction of each
 * branch in the history of a particular line <node>.
 */ 

typedef struct _link_node {
  struct _link_node	* parent;
  char			direction;
  int			width;
} link_node;  

char balance_chars[3] = {'\\', '-', '/'};

int
default_key_printer (char * buffer, void * key)
{
  return sprintf (buffer, "%p", key);
}  

/*
 * When traveling the family tree, a change in direction
 * indicates when to print a connector.  This is kinda crazy,
 * we use the stack to build a linked list, and then travel
 * it backwards using recursion.
 */

void
print_connectors (link_node * link)
{
  if (link->parent) {
    print_connectors (link->parent);
  }
  if (link->parent && (link->parent->direction != link->direction) && (link->parent->parent)) {
    int i;
    fprintf (stdout, "|");
    for (i=0; i < (link->width - 1); i++) {
      fprintf (stdout, " ");
    }
  } else {
    int i;
    for (i=0; i < (link->width); i++) {
      fprintf (stdout, " ");
    }
  }
}

/*
 * The <key_printer> function writes a representation of the
 * key into <buffer> (which is conveniently fixed in size to add
 * the spice of danger).  It should return the size of the
 * representation.
 */

void
print_node (avl_key_printer_fun_type key_printer,
	    avl_node * node,
	    link_node * link)
{
  char buffer[256];
  unsigned int width;
  link_node *here;
  width = key_printer (buffer, node->key);

  if (node->right) {
    /* link_node here = {link, 1, width+11}; */
    here=(link_node *)malloc(sizeof(link_node));
    here->parent=link;
    here->direction=1;
    here->width=width+11;
    print_node (key_printer, node->right, here);
  }
  print_connectors (link);
  fprintf (stdout, "+-[%c %s %03d]",
	   balance_chars[GET_BALANCE(node)+1],
	   buffer,
	   (int)GET_RANK(node));
  if (node->left || node->right) {
    fprintf (stdout, "-|\n");
  } else {
    fprintf (stdout, "\n");
  }
  if (node->left) {
    /* link_node here = {link, -1, width+11}; */
    here=(link_node *)malloc(sizeof(link_node));
    here->parent=link;
    here->direction=-1;
    here->width=width+11;
    print_node (key_printer, node->left, here);
  } 
}  

void
print_tree (avl_tree * tree, avl_key_printer_fun_type key_printer)
{
  link_node top = {NULL, 0, 0};
  if (!key_printer) {
    key_printer = default_key_printer;
  }
  if (tree->length) {
    print_node (key_printer, tree->root->right, &top);
  } else {
    fprintf (stdout, "<empty tree>\n");
  }  
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产99久久久国产精品潘金| 一本久久a久久免费精品不卡| ...av二区三区久久精品| 欧美精品一级二级| 成人激情黄色小说| 老司机一区二区| 亚洲最新在线观看| 久久久不卡网国产精品二区| 精品视频在线免费看| 成人激情免费网站| 国内久久精品视频| 免费视频一区二区| 一区二区三区加勒比av| 国产精品五月天| 精品国产凹凸成av人导航| 91福利小视频| 99精品在线观看视频| 国产成人精品影院| 极品销魂美女一区二区三区| 亚洲国产精品久久久久秋霞影院| 中文av字幕一区| 久久久久久久久免费| 欧美一区二区久久| 欧美一区二区国产| 欧美人伦禁忌dvd放荡欲情| 色婷婷精品大在线视频| 91精品国产综合久久久久| 欧美日韩一区中文字幕| 在线观看日韩电影| 欧洲一区二区三区免费视频| 91女人视频在线观看| av亚洲精华国产精华精| 成人中文字幕合集| 国v精品久久久网| 国产成人啪免费观看软件| 国产乱人伦偷精品视频免下载| 欧美日本视频在线| 欧美日韩一级片在线观看| 色999日韩国产欧美一区二区| fc2成人免费人成在线观看播放| 丰满亚洲少妇av| 国产一区不卡在线| 国产九色sp调教91| 成人激情图片网| 色综合中文字幕| 欧美三级三级三级爽爽爽| 欧美日韩亚洲高清一区二区| 欧美日韩国产在线播放网站| 欧美三级中文字| 欧美一区二区三区四区高清| 日韩精品一区二区三区在线播放 | 久久久久久久久免费| 久久久777精品电影网影网| 国产亚洲精品精华液| 国产精品乱码人人做人人爱 | 成人av电影在线| 97久久精品人人做人人爽| 91色婷婷久久久久合中文| 色天天综合久久久久综合片| 欧美日韩一级片网站| 精品日韩一区二区| 国产欧美一区二区三区在线看蜜臀| 国产午夜精品久久久久久久 | 欧美日韩中文一区| 精品免费日韩av| 国产日韩精品一区二区三区| 亚洲日穴在线视频| 丝袜诱惑制服诱惑色一区在线观看| 免费成人美女在线观看.| 岛国av在线一区| 欧美中文字幕亚洲一区二区va在线| 8v天堂国产在线一区二区| 久久久久久久久一| 亚洲电影一区二区| 国模无码大尺度一区二区三区| 99精品国产热久久91蜜凸| 欧美日韩黄视频| 国产日韩欧美精品电影三级在线 | 国产精品一区二区x88av| 91在线精品一区二区三区| 制服丝袜在线91| 久久久久国产成人精品亚洲午夜| 国产精品久久久久久久久晋中 | 国产欧美日韩中文久久| 亚洲综合成人在线视频| 九九九久久久精品| 91久久香蕉国产日韩欧美9色| 欧美一区二区三区小说| 中文字幕日韩一区二区| 青青草成人在线观看| 91丨porny丨最新| 欧美tickling挠脚心丨vk| 亚洲精品国产一区二区精华液 | 久久激情综合网| 一本色道久久综合狠狠躁的推荐| 欧美不卡视频一区| 亚洲激情六月丁香| 国产成人aaaa| 欧美一区二区在线免费播放 | 欧美激情艳妇裸体舞| 日韩经典中文字幕一区| 成人激情av网| 2024国产精品视频| 天天影视涩香欲综合网| 91麻豆成人久久精品二区三区| 久久你懂得1024| 美女视频一区二区| 欧美丝袜第三区| 亚洲视频在线一区观看| 国产精品亚洲人在线观看| 欧美一区二区二区| 亚洲国产wwwccc36天堂| 91同城在线观看| 亚洲国产精品99久久久久久久久| 三级欧美在线一区| 欧美日韩情趣电影| 一区二区三区在线视频播放| av网站一区二区三区| 久久精品人人做人人综合| 久久国产婷婷国产香蕉| 欧美精品第1页| 亚洲成人777| 欧美亚日韩国产aⅴ精品中极品| 亚洲天堂久久久久久久| 国产激情视频一区二区在线观看 | 成人91在线观看| 久久精品视频免费观看| 国产一区不卡精品| 国产亚洲一二三区| 国产高清不卡二三区| 国产女同互慰高潮91漫画| 国产成人综合在线播放| 国产亚洲精品bt天堂精选| 国产精品 日产精品 欧美精品| 精品国产乱码久久久久久久久 | 欧美高清精品3d| 亚洲不卡一区二区三区| 欧美亚男人的天堂| 五月婷婷色综合| 欧美一卡二卡三卡| 久草中文综合在线| 精品福利视频一区二区三区| 国产精品一线二线三线| 国产精品视频第一区| 99精品国产热久久91蜜凸| 亚洲综合在线观看视频| 欧美色网站导航| 免费一级欧美片在线观看| 欧美mv和日韩mv的网站| 粉嫩一区二区三区在线看| 国产午夜精品久久久久久久| 99re热这里只有精品视频| 一区二区欧美在线观看| 欧美一级理论片| 国产91精品一区二区麻豆网站| 国产精品剧情在线亚洲| 色婷婷av久久久久久久| 日韩av中文字幕一区二区三区| 精品久久久久久无| 99久久er热在这里只有精品15| 一区二区视频免费在线观看| 欧美日韩1234| 极品美女销魂一区二区三区| 国产精品久久毛片a| 欧美视频自拍偷拍| 国产在线视频一区二区| 中文字幕亚洲在| 91精品国产免费久久综合| 狠狠色狠狠色综合日日91app| 亚洲欧美怡红院| 91精品国产色综合久久| 国产成人精品免费在线| 亚洲在线视频免费观看| www一区二区| 91福利在线播放| 国产精品一级二级三级| 亚洲一区二区三区精品在线| 精品国产一区二区三区不卡 | 成人av手机在线观看| 五月天精品一区二区三区| 国产婷婷精品av在线| 欧美三级在线视频| 成人美女视频在线观看| 天堂蜜桃91精品| 一区精品在线播放| 日韩免费视频一区二区| 日本精品一区二区三区四区的功能| 麻豆国产精品一区二区三区 | 日韩激情一二三区| 国产精品乱人伦| 欧美电影免费观看高清完整版在 | 一区二区三区高清不卡| 久久影视一区二区| 欧美少妇bbb| 成人app在线观看| 国内外精品视频| 午夜精品免费在线| 亚洲图片欧美激情| 国产欧美一区二区三区在线看蜜臀 | 欧美日韩成人在线|