コード例 #1
0
ファイル: BTree.c プロジェクト: tenywen/alg
// 调整删除以后节点红黑属性
int _del_fixed(pBTreeHead head, pBTreeNode x) {
	while(x != NIL && _BTREE_COLOR(x) == BLACK) {
		pBTreeNode w = _BTREE_LEFT(_BTREE_PARENT(x));
		if (w == x)
			w = _BTREE_RIGHT(_BTREE_PARENT(x));
		// 1.如果x的兄弟节点w是红色.首先w节点的子节点肯定存在且均为黑。原因这里不叙述。
		//   (只要明白从一个节点到它的每个叶子节点的黑高度相等)
		if (_BTREE_COLOR(w) == RED) {
			_SET_COLOR(w,BLACK);
			_SET_COLOR(_BTREE_PARENT(w),RED);
			if (w == _BTREE_RIGHT(_BTREE_PARENT(x)))
				_LEFT_ROTATE(head,w);
			else
				_RIGHT_ROTATE(head,w);
		} else if(_BTREE_COLOR(_BTREE_LEFT(w)) == BLACK && _BTREE_COLOR(_BTREE_RIGHT(w)) == BLACK) {
			// 2.x的兄弟节点w是红色.
			_SET_COLOR(w,RED);
			x = _BTREE_PARENT(x);
		} else if(_BTREE_COLOR(_BTREE_LEFT(w)) == RED && _BTREE_COLOR(_BTREE_RIGHT(w)) == BLACK) {
			// 3.x的兄弟节点w是黑色,且w的左子为红,右子为黑
			_SET_COLOR(w,RED);
			_SET_COLOR(_BTREE_LEFT(w),BLACK);
			_LEFT_ROTATE(head,w);
		} else if(_BTREE_COLOR(_BTREE_RIGHT(w)) == RED) {
			// 4.x的兄弟节点w是黑色,且右子为红色
			pBTreeNode parent = _BTREE_PARENT(x);
			_SET_COLOR(_BTREE_RIGHT(w),BLACK);
			_SET_COLOR(w,_BTREE_COLOR(parent));
			_SET_COLOR(parent,BLACK);
			if (w == _BTREE_RIGHT(parent)) 
				_LEFT_ROTATE(head,parent);
			else 
				_RIGHT_ROTATE(head,parent);
			x = head->Next;
		}
	}
	_SET_COLOR(x, BLACK);
	return 0;	
}
コード例 #2
0
ファイル: BTree.c プロジェクト: tenywen/alg
// 调整插入后红黑属性
int _insert_fixed(pBTreeHead head,pBTreeNode z) {
	pBTreeNode uncle = NULL;
	while(_BTREE_PARENT(z) != NIL && _BTREE_COLOR((_BTREE_PARENT(z))) == RED) {
		if ((_BTREE_PARENT(_BTREE_PARENT(z))) == NIL) 
			break;
		if(_BTREE_PARENT(z) == _BTREE_LEFT(_BTREE_PARENT(_BTREE_PARENT(z))))
			uncle = _BTREE_RIGHT(_BTREE_PARENT(_BTREE_PARENT(z)));
		else 
			uncle = _BTREE_LEFT(_BTREE_PARENT(_BTREE_PARENT(z)));
		// 节点z的叔叔节点为红色,此为情况1:
		// 将z的父节点和叔叔节点置为黑,z变更为祖父节点。重复while循环
		if(_BTREE_COLOR(uncle) == RED) {
			_SET_COLOR(uncle,BLACK);
			_SET_COLOR(_BTREE_PARENT(z),BLACK);
			_SET_COLOR(_BTREE_PARENT(_BTREE_PARENT(z)),RED);
			z = _BTREE_PARENT(_BTREE_PARENT(z));	
		} else {
			// 节点z的叔叔节点为黑色,此为情况2,3:
			if(z == _BTREE_RIGHT(_BTREE_PARENT(z))) {
				// z上升一层
				z = _BTREE_PARENT(z);	
				_LEFT_ROTATE(head,z);
			}
			_SET_COLOR(_BTREE_PARENT(z),BLACK);
			_SET_COLOR(_BTREE_PARENT(_BTREE_PARENT(z)),RED);
			// 这里必须用一个变量x 来存储z的祖父节点,传递给下面的左转或者右转
			// 否则左转或者右转的宏,会改变z->Parent
			pBTreeNode x = _BTREE_PARENT(_BTREE_PARENT(z));
			if(_BTREE_PARENT(z) == _BTREE_LEFT(_BTREE_PARENT(_BTREE_PARENT(z))))
				_RIGHT_ROTATE(head,x);
			else 
				_LEFT_ROTATE(head,x);
		}
	}
	_SET_COLOR(head->Next,BLACK);
}
コード例 #3
0
ファイル: qplot.cpp プロジェクト: beg0/qplot
//----------------------------------------------------------------------------
// fill PlotAreaConf from INI-file section
bool qplot_read_conf(aclass::aini *f,    // INI-file
                     const char *s,      // section
                     PlotAreaConf *conf) // output data
{
  // проверить наличие секции
  if (!f->has_section(s)) return false;

  qDebug("qplot_read_conf(): read section '%s'' in '%s' file",
         s, f->get_fname());

  // булевы опции
  conf->zoom     = f->read_bool(s, "zoom",     conf->zoom);
  conf->legend   = f->read_bool(s, "legend",   conf->legend);
  conf->grid     = f->read_bool(s, "grid",     conf->grid);
  conf->gridXMin = f->read_bool(s, "gridXmin", conf->gridXMin);
  conf->gridYMin = f->read_bool(s, "gridYmin", conf->gridYMin);
  conf->antialiased    = f->read_bool(s, "antialiased", conf->antialiased);
  conf->pickerAlwaysOn = f->read_bool(s, "pickerAlwaysOn",
                                      conf->pickerAlwaysOn);

  // шаг сдига/прокрутки в процентах
  conf->scrollXStep = f->read_double(s, "scrollXStep", conf->scrollXStep);
  conf->scrollYStep = f->read_double(s, "scrollYStep", conf->scrollYStep);

  // шаг zoom в процентах
  conf->zoomXStep = f->read_double(s, "zoomXStep", conf->zoomXStep);
  conf->zoomYStep = f->read_double(s, "zoomYStep", conf->zoomYStep);

	// основные цвета
  _SET_COLOR    (f, s, "background",     conf->background);
  _SET_PEN_COLOR(f, s, "zoomColor",      conf->zoomPen);
  _SET_PEN_COLOR(f, s, "gridMajorColor", conf->gridMajorPen);
  _SET_PEN_COLOR(f, s, "gridMinorColor", conf->gridMinorPen);
  _SET_PEN_COLOR(f, s, "pickerColor",    conf->pickerPen);
  _SET_PEN_COLOR(f, s, "trackerColor",   conf->trackerPen);
  _SET_PEN_COLOR(f, s, "vLineColor",     conf->vLinePen);
  _SET_PEN_COLOR(f, s, "hLineColor",     conf->hLinePen);
  _SET_PEN_COLOR(f, s, "markerColor",    conf->markerPen);
  _SET_PEN_COLOR(f, s, "markerBrush",    conf->markerBrush);
  conf->vLineTextColor  = conf->vLinePen.color();
  conf->hLineTextColor  = conf->hLinePen.color();
  conf->markerTextColor = conf->markerPen.color();

  // основной шрифт
  QString fontFamily = _QS(f->read_str(s, "fontFamily",
                                       _CS(conf->markerFont.family())));
  conf->trackerFont.setFamily(fontFamily);
  conf->markerFont.setFamily(fontFamily);
  conf->vLineFont.setFamily(fontFamily);
  conf->hLineFont.setFamily(fontFamily);

  int fontSize = (int) f->read_long(s, "fontSize",
                                    conf->markerFont.pointSize());
  conf->trackerFont.setPointSize(fontSize);
  conf->markerFont.setPointSize(fontSize);
  conf->vLineFont.setPointSize(fontSize);
  conf->hLineFont.setPointSize(fontSize);
  
  int weight = conf->markerFont.weight();
  std::string str = f->read_str(s, "fontWeight",
                                weight == QFont::Light    ? "Light"    :
                                weight == QFont::Normal   ? "Normal"   :
                                weight == QFont::DemiBold ? "DemiBold" :
                                weight == QFont::Bold     ? "Bold"     :
                                weight == QFont::Black    ? "Black"    :
                                "Normal");
  transform(str.begin(), str.end(), str.begin(), tolower);
  weight = str == "light"    ?  QFont::Light    :
           str == "normal"   ?  QFont::Normal   :
           str == "demibold" ?  QFont::DemiBold :
           str == "bold"     ?  QFont::Bold     :
           str == "black"    ?  QFont::Black    : QFont::Normal;
  conf->trackerFont.setWeight(weight);
  conf->markerFont.setWeight(weight);
  conf->vLineFont.setWeight(weight);
  conf->hLineFont.setWeight(weight);
  bool italic = f->read_bool(s, "fontItalic", conf->markerFont.italic());
  conf->trackerFont.setItalic(italic);
  conf->markerFont.setItalic(italic);
  conf->vLineFont.setItalic(italic);
  conf->hLineFont.setItalic(italic);

  // размер маркера
  conf->markerSize = (int) f->read_long(s, "markerSize",
                                        (long) conf->markerSize);
  return true;
}