00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "tree.h"
00022 #include "functext.h"
00023
00024 TTree::TTree()
00025 {
00026 Root=new Node;
00027 Root->Parent=NULL;
00028 Root->Child_One=NULL;
00029 Root->Child_Two=NULL;
00030 Root->Brackets=0;
00031 Root->evalfn = NULL;
00032 }
00033
00034 TTree::~TTree()
00035 {
00036 Delete(Root);
00037 }
00038
00039 void
00040 TTree::InitNode(Node *Initnode, func_type type, NumVar val, int brack)
00041 {
00042 Initnode->Type=type;
00043 Initnode->Value=val;
00044 Initnode->Brackets=brack;
00045 Initnode->evalfn = func_details[type].func_ptr;
00046 }
00047
00048 void
00049 TTree::InitNode(Node *Initnode, func_type type)
00050 {
00051 Initnode->Type = type;
00052 Initnode->Value.Number = 0.0;
00053 Initnode->Brackets = 0;
00054 Initnode->evalfn = func_details[type].func_ptr;
00055 }
00056
00057 Node *
00058 TTree::AddParent(Node *TreePos)
00059 {
00060 Node *Temp;
00061 Temp=TreePos->Parent;
00062 (TreePos->Parent)=new Node;
00063 (TreePos->Parent)->Child_One=TreePos;
00064 TreePos=TreePos->Parent;
00065 TreePos->Parent=Temp;
00066 if (Temp!=NULL)
00067 {
00068 if (Temp->Child_One==TreePos->Child_One)
00069 {
00070 Temp->Child_One=TreePos;
00071 }
00072 else
00073 {
00074 Temp->Child_Two=TreePos;
00075 };
00076 }
00077 else
00078 {
00079 Root=TreePos;
00080 };
00081 return TreePos;
00082 }
00083
00084 Node *
00085 TTree::AddChildOne(Node *TreePos)
00086 {
00087 Node *Temp;
00088 Temp=TreePos->Child_One;
00089 TreePos->Child_One=new Node;
00090 (TreePos->Child_One)->Parent=TreePos;
00091 TreePos=TreePos->Child_One;
00092 TreePos->Child_One=Temp;
00093 if (Temp!=NULL)
00094 {
00095 Temp->Parent=TreePos;
00096 };
00097 return TreePos;
00098 }
00099
00100 Node *
00101 TTree::AddChildTwo(Node *TreePos)
00102 {
00103 Node *Temp;
00104 Temp=TreePos->Child_Two;
00105 TreePos->Child_Two=new Node;
00106 (TreePos->Child_Two)->Parent=TreePos;
00107 TreePos=TreePos->Child_Two;
00108 TreePos->Child_One=Temp;
00109 if (Temp!=NULL) Temp->Parent=TreePos;
00110 return TreePos;
00111 }
00112
00113 Node *
00114 TTree::DeleteNode(Node *TreePos, Node *Blank, Node *Other)
00115 {
00116 Node *Temp;
00117 if (Blank==NULL) {
00118 Blank=TreePos->Child_Two;
00119 Other=TreePos->Child_One;
00120 };
00121 if (Blank!=NULL) Delete(Blank);
00122 if (TreePos==Root) {
00123 Root=Other;
00124 Root->Parent=NULL;
00125 delete TreePos;
00126 return Root;
00127 };
00128 if (Other!=NULL) {
00129 Other->Parent=TreePos->Parent;
00130 };
00131 Temp=TreePos;
00132 TreePos=TreePos->Parent;
00133 if (TreePos!=NULL) {
00134 if (TreePos->Child_One==Temp) TreePos->Child_One=Other;
00135 else TreePos->Child_Two=Other;
00136 }
00137 delete Temp;
00138 return Other;
00139 }
00140
00141 void
00142 TTree::Reset(int SetTo,Node *Start)
00143 {
00144 if (Start==NULL) Start=Root;
00145 Node *TreePos;
00146 TreePos=Start;
00147 while (Start->Brackets!=SetTo)
00148 {
00149 while (TreePos->Child_One!=NULL)
00150 {
00151 if ((TreePos->Child_One)->Brackets==SetTo) break;
00152 TreePos=TreePos->Child_One;
00153 };
00154 TreePos->Brackets=SetTo;
00155 if (TreePos==Start) break;
00156 TreePos=TreePos->Parent;
00157 if (TreePos->Child_Two!=NULL)
00158 {
00159 if ((TreePos->Child_Two)->Brackets!=SetTo)
00160 {
00161 TreePos=TreePos->Child_Two;
00162 }
00163 else
00164 {
00165 TreePos->Brackets=SetTo;
00166 };
00167 }
00168 else
00169 {
00170 TreePos->Brackets=SetTo;
00171 };
00172 };
00173 }
00174
00175 Node *
00176 TTree::Copy(Node *From,Node *To)
00177 {
00178 Node *PointerFrom=From;
00179 Node *PointerTo=To;
00180
00181 if (PointerFrom==NULL) return NULL;
00182 To->Brackets=0;
00183 PointerTo->Child_Two=NULL;
00184 PointerTo->Type=PointerFrom->Type;
00185 PointerTo->evalfn = PointerFrom->evalfn;
00186 PointerTo->Value=PointerFrom->Value;
00187 PointerTo->CurrentValue=0;
00188 while (To->Brackets==0)
00189 {
00190 while (PointerFrom->Child_One!=NULL)
00191 {
00192 PointerTo->Child_One=new Node;
00193 (PointerTo->Child_One)->Parent=PointerTo;
00194 PointerTo=PointerTo->Child_One;
00195 PointerFrom=PointerFrom->Child_One;
00196 PointerTo->Child_Two=NULL;
00197 PointerTo->Type=PointerFrom->Type;
00198 PointerTo->evalfn=PointerFrom->evalfn;
00199 PointerTo->Value=PointerFrom->Value;
00200 PointerTo->Brackets=0;
00201 PointerTo->CurrentValue=0;
00202 };
00203 PointerTo->Child_One=NULL;
00204 PointerTo->Brackets=1;
00205 while (PointerFrom!=From)
00206 {
00207 if ((PointerFrom->Child_Two!=NULL)&&(PointerTo->Child_Two==NULL)) break;
00208 PointerFrom=PointerFrom->Parent;
00209 PointerTo->Brackets=1;
00210 PointerTo=PointerTo->Parent;
00211 };
00212 if ((PointerFrom==From)&&((PointerFrom->Child_Two==NULL)
00213 ||(PointerTo->Child_Two!=NULL))) break;
00214 if ((PointerFrom->Child_Two!=NULL)&&(PointerTo->Brackets==0))
00215 {
00216 PointerTo->Child_Two=new Node;
00217 (PointerTo->Child_Two)->Parent=PointerTo;
00218 PointerTo=PointerTo->Child_Two;
00219 PointerFrom=PointerFrom->Child_Two;
00220 PointerTo->Brackets=0;
00221 PointerTo->Type=PointerFrom->Type;
00222 PointerTo->evalfn=PointerFrom->evalfn;
00223 PointerTo->Value=PointerFrom->Value;
00224 PointerTo->CurrentValue=0;
00225 PointerTo->Child_Two=NULL;
00226 }
00227 else
00228 {
00229 To->Brackets=1;
00230 };
00231 };
00232 Reset(2,To);
00233 Reset(0,To);
00234 return To;
00235 }
00236
00237 void
00238 TTree::Delete(Node *From)
00239 {
00240 Node *Temp=From;
00241 Node *Marked=NULL;
00242 if (From==NULL) return;
00243 while ((From->Child_One!=NULL)||(From->Child_Two!=NULL)) {
00244 while (Temp->Child_One!=NULL) {
00245 Temp=Temp->Child_One;
00246 };
00247 Marked=Temp;
00248 Temp=Temp->Parent;
00249 if (Temp->Child_One==Marked) {
00250 Temp->Child_One=NULL;
00251 }
00252 else {
00253 Temp->Child_Two=NULL;
00254 };
00255 delete Marked;
00256 while ((Temp->Child_Two==NULL)&&(Temp!=From)) {
00257 Marked=Temp;
00258 Temp=Temp->Parent;
00259 if (Temp->Child_One==Marked) {
00260 Temp->Child_One=NULL;
00261 }
00262 else {
00263 Temp->Child_Two=NULL;
00264 };
00265 delete Marked;
00266 Temp->Child_One=NULL;
00267 };
00268 if (Temp->Child_Two!=NULL) {
00269 Temp=Temp->Child_Two;
00270 }
00271 else {
00272 break;
00273 };
00274 };
00275 delete From;
00276 }
00277
00278
00279 Node *
00280 TTree::AddBelowOne(Node *Pointer,func_type Type,double Value)
00281 {
00282 Pointer->Child_One=new Node;
00283 (Pointer->Child_One)->Parent=Pointer;
00284 Pointer=Pointer->Child_One;
00285 Pointer->Child_One=NULL;
00286 Pointer->Child_Two=NULL;
00287 Pointer->Type=Type;
00288 Pointer->evalfn = func_details[Type].func_ptr;
00289 (Pointer->Value).Number=Value;
00290 Pointer->Brackets=0;
00291 return Pointer;
00292 }
00293
00294 Node *
00295 TTree::AddBelowTwo(Node *Pointer,func_type Type,double Value)
00296 {
00297 Pointer->Child_Two=new Node;
00298 (Pointer->Child_Two)->Parent=Pointer;
00299 Pointer=Pointer->Child_Two;
00300 Pointer->Child_One=NULL;
00301 Pointer->Child_Two=NULL;
00302 Pointer->Type=Type;
00303 Pointer->evalfn = func_details[Type].func_ptr;
00304 (Pointer->Value).Number=Value;
00305 Pointer->Brackets=0;
00306 return Pointer;
00307 }