|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Реализация функций структуры
При внесении данных в структуру, первоначально генерируется «pseudokey», после чего алгоритм проверяет, существует ли первый элемент дерева. Если данные до этого не вводились, то выделяется память под один узел дерева и текущее значение помещается в данный узел. Если же в структуре уже имеются элементы, то данные добавляются в ближайший свободный элемент, путь к которому соответствует «pseudokey». Функция, реализующая добавление элемента:
int Past(BH *root, String *data,int coll,int pos) { char *p=Key_Gen(data,coll); if(root==NULL) {root=new (BH); Past(root,data,coll,pos); return 1; } else { if(root->BH_data==NULL && root->Left==NULL && root->Right==NULL) {root->BH_data=data; root->collData=coll; return 1; } else {if(root->BH_data==NULL) { if(p[pos]=='0') { if(root->Right==NULL) { BH *tmp = new BH; root->Right=tmp; root->Right->BH_data=data; root->Right->collData=coll; return 1; } else { Past(root->Right,data,coll,++pos); return 1; } } if(p[pos]=='1') { if(root->Left==NULL) { BH *tmp =new BH; root->Left=tmp; root->Left->BH_data=data; root->Left->collData=coll; return 1; } else { Past(root->Left,data,coll,++pos); return 1; } } } if(root->BH_data!=NULL) { if(*root->BH_data==*data)return 1; if(p[pos]=='0') { BH * tmp =new BH; root->Right=tmp; root->Right->BH_data=data; root->Right->collData=coll; } if(p[pos]=='1') { BH * tmp =new BH; root->Left=tmp; root->Left->BH_data=data; root->Left->collData=coll; } int dd = root->collData; String *ddd = new String; *ddd=*root->BH_data; delete(root->BH_data); root->BH_data=NULL; root->collData=0; Past(root,ddd,dd,pos); return 1; } } } }
При внесении данных автоматически выполняется функция прорисовки дерева:
void paintTree(TImage *img, int x, int y,int _x=0, int _y=0) { img->Canvas->Rectangle(0,0,img->Width,img->Height); img->Canvas->Brush->Color=clWhite; img->Canvas->FloodFill(0,0,clWhite,fsBorder); img->Canvas->CleanupInstance(); paintRoot(img,Head, x, y,100,20,_x,_y) ;}
Данная функция вызывает функцию рисования узла дерева и затем посредством рекурсивных вызовов прорисовывают всё дерево: void paintRoot(TImage *img,BH *root,int x, int y,int n=1,int m=1,int _x=0, int _y=0) { n-=25; m+=10; if(_x>=x & _x<=x+20 & _y>=y & _y<=y+20) { img->Canvas->Brush->Color=clWhite; img->Canvas->Font->Size=24; if(root!=NULL) if(root->BH_data!=NULL) img->Canvas->TextOutA(10,10,(*root->BH_data)); } if(root==NULL) { img->Canvas->Brush->Color=clRed; img->Canvas->Ellipse(x,y,(x+10),(y+10)); } else { if(root!=NULL && root->BH_data==NULL) { img->Canvas->Brush->Color=clBlue; img->Canvas->Ellipse(x,y,(x+10),(y+10)); img->Canvas->MoveTo(x+5,y+5); img->Canvas->LineTo(x-5-n,y+15+m); paintRoot(img,root->Left,x-10-n,y+10+m,n,m,_x,_y); img->Canvas->MoveTo(x+5,y+5); img->Canvas->LineTo(x+15+n,y+15+m); paintRoot(img,root->Right,x+10+n,y+10+m,n,m,_x,_y); } else { img->Canvas->Brush->Color=clGreen; img->Canvas->Ellipse(x,y,x+10,y+10); img->Canvas->MoveTo(x+5,y+5); img->Canvas->LineTo(x-5-n,y+15+m); paintRoot(img,root->Left,x-10-n,y+10+m,n,m,_x,_y); img->Canvas->MoveTo(x+5,y+5); img->Canvas->LineTo(x+15+n,y+15+m); paintRoot(img,root->Right,x+10+n,y+10+m,n,m,_x,_y); } } }
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |