// 调整删除以后节点红黑属性 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; }
// 调整插入后红黑属性 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); }
//---------------------------------------------------------------------------- // 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; }