bool Tree<Key,Val>::insert(Key* key, Val* val) { //Node<Key,Val>* node=root;//can directly use root if (isEmpty()) { root=new Node<Key,Val>;//should use "root" not node root->lkey=key;//if not pointer,should use &key root->lval=val; root->left=root->right=root->center=NULL; root->rkey=NULL; root->rval=NULL; return true; } Val* a=search(*key);//check if (*key) exist in the tree if (a!=NULL) return false; Node<Key,Val>* node1=NULL; Node<Key,Val>* node2=NULL; bool t=insert_help(root,&node1,&node2,key,val); if (t){//new node at root root=new Node<Key,Val>; root->lkey=key;//if not pointer,should use &key root->lval=val; root->rkey=NULL; root->rval=NULL; root->left=node1; root->center=node2; root->right=NULL; } return true; }
void insert_sort(int* list) { int a=1; while(a) { a=insert_help(list); } }
void insert_sort(int* list, int* max) { int a=1; while(a) { a=insert_help(list, max); } }
// Read one statement Expr* IpeReader::readStmt() { int lexerStatus = 100; int parserStatus = YYPUSH_MORE; Expr* retval = 0; mContext.latestComment = NULL; while (lexerStatus != 0 && parserStatus == YYPUSH_MORE && retval == 0) { YYSTYPE yylval; mContext.generatedStmt = NULL; lexerStatus = yylex(&yylval, &mYYlloc, mContext.scanner); if (lexerStatus >= 0) parserStatus = yypush_parse(mParser, lexerStatus, &yylval, &mYYlloc, &mContext); else if (lexerStatus == YYLEX_BLOCK_COMMENT) mContext.latestComment = yylval.pch; if (mContext.generatedStmt != 0) { if (BlockStmt* bs = toBlockStmt(mContext.generatedStmt)) { if (Expr* expr = bs->body.last()) retval = expr; } } } if (retval != 0) insert_help(retval, NULL, NULL); return retval; }
void Expr::replace(Expr* new_ast) { if (new_ast->parentSymbol || new_ast->parentExpr) INT_FATAL(new_ast, "Argument is already in AST in Expr::replace"); if (new_ast->list) INT_FATAL(new_ast, "Argument is in a list in Expr::replace"); if (list) { new_ast->next = next; new_ast->prev = prev; new_ast->list = list; if (next) next->prev = new_ast; else list->tail = new_ast; if (prev) prev->next = new_ast; else list->head = new_ast; next = NULL; prev = NULL; list = NULL; } else { callReplaceChild(this, new_ast); } Symbol* myParentSymbol = parentSymbol; Expr* myParentExpr = parentExpr; remove_help(this, 'p'); insert_help(new_ast, myParentExpr, myParentSymbol); // Update the _this field in a FnSymbol if necessary. if (DefExpr* def = toDefExpr(this)) if (ArgSymbol* arg = toArgSymbol(def->sym)) if (FnSymbol* fn = toFnSymbol(myParentSymbol)) if (fn->_this == arg) fn->_this = toDefExpr(new_ast)->sym; }
static bool insert_help(Node<Key,Val>* node, Node<Key,Val>** node1_tem, Node<Key,Val>** node2_tem, Key* &key,Val* &val) { Node<Key,Val>* node1=NULL;//create node1 at this level Node<Key,Val>* node2=NULL;//create node2 at this level Node<Key,Val>* newnode=NULL;//create a new node at this level Node<Key,Val>* nodeposition[4]; Key* tem_key[3]; Val* tem_val[3]; if (node->left!=NULL) //interior node { if (*(key)<*(node->lkey)) {//left-insert bool a=insert_help(node->left,&node1,&node2,key,val); if (a==false) return false; if (node->rkey!=NULL){//3-node under left-insert tem_key[0]=key; tem_key[1]=node->lkey; tem_key[2]=node->rkey; tem_val[0]=val; tem_val[1]=node->lval; tem_val[2]=node->rval; nodeposition[0]=node1; nodeposition[1]=node2; nodeposition[2]=node->center; nodeposition[3]=node->right; }else {//2-node under left-insert node->rkey=node->lkey; node->rval=node->lval; node->lkey=key; node->lval=val; node->right=node->center; node->center=node2; node->left=node1; return false; } }else {//center-insert or right-insert if (node->rkey==NULL){ //center-insert or right-insert based on 2-node if (*(key)>*(node->lkey)) {//center-insert based on 2-node bool a=insert_help(node->center,&node1,&node2,key,val); if (a==false) return false; node->rkey=key; node->rval=val; node->center=node1; node->right=node2; return false; } }else { //center-insert or right-insert based on 3-node if (*(key)<*(node->rkey)) { //center-insert based on 3-node bool a=insert_help(node->center,&node1,&node2,key,val); if (a==false) return false; tem_key[0]=node->lkey; tem_key[1]=key; tem_key[2]=node->rkey; tem_val[0]=node->lval; tem_val[1]=val; tem_val[2]=node->rval; nodeposition[0]=node->left; nodeposition[1]=node1; nodeposition[2]=node2; nodeposition[3]=node->right; } if (*(key)>*(node->rkey)) {//right-insert based on 3-node bool a=insert_help(node->right,&node1,&node2,key,val); if (a==false) return false; tem_key[0]=node->lkey; tem_key[1]=node->rkey; tem_key[2]=key; tem_val[0]=node->lval; tem_val[1]=node->rval; tem_val[2]=val; nodeposition[0]=node->left; nodeposition[1]=node->center; nodeposition[2]=node1; nodeposition[3]=node2; } } } } else//leaf node { if (node->rkey!=NULL){ //3-node leaf if (*(key)<*(node->lkey)) {//left-insert tem_key[0]=key; tem_key[1]=node->lkey; tem_key[2]=node->rkey; tem_val[0]=val; tem_val[1]=node->lval; tem_val[2]=node->rval; nodeposition[0]=NULL; nodeposition[1]=NULL; nodeposition[2]=NULL; nodeposition[3]=NULL; }else if (*(key)>*(node->rkey)) {//right-insert tem_key[0]=node->lkey; tem_key[1]=node->rkey; tem_key[2]=key; tem_val[0]=node->lval; tem_val[1]=node->rval; tem_val[2]=val; nodeposition[0]=NULL; nodeposition[1]=NULL; nodeposition[2]=NULL; nodeposition[3]=NULL; }else {//center-insert tem_key[0]=node->lkey; tem_key[1]=key; tem_key[2]=node->rkey; tem_val[0]=node->lval; tem_val[1]=val; tem_val[2]=node->rval; nodeposition[0]=NULL; nodeposition[1]=NULL; nodeposition[2]=NULL; nodeposition[3]=NULL; } }else { //2-node leaf if (*(key)<*(node->lkey)) {//left-insert node->rkey=node->lkey; node->rval=node->lval; node->lkey=key; node->lval=val; }else {//right-insert node->rkey=key; node->rval=val; } return false; } } //reset key and val key=tem_key[1]; val=tem_val[1]; //reset the node and newnode, and newnode is always at the right of node at same level node->lkey=tem_key[0]; node->rkey=NULL; node->lval=tem_val[0]; node->rval=NULL; node->left=nodeposition[0]; node->center=nodeposition[1]; node->right=NULL; newnode=new Node<Key,Val>; newnode->lkey=tem_key[2]; newnode->rkey=NULL; newnode->lval=tem_val[2]; newnode->rval=NULL; newnode->left=nodeposition[2]; newnode->center=nodeposition[3]; newnode->right=NULL; //reset the node1_tem and node2_tem *node1_tem=node; *node2_tem=newnode; return true; }