inline void delete_node(void** seg, void** tail, void *bp) { #ifdef __DEBUG__ printf("Delete node / *seg : %u, tail : %u, bp : %u\n", *seg, *tail, bp); #endif if(isHead(bp) && isTail(bp)) //make list empty { *seg = NULL; *tail = NULL; return; } else if(isHead(bp)) //move head { *seg = getNextNode(*seg); setPrevNode(*seg, *seg); return; } else if(isTail(bp)) //move tail { *tail = getPrevNode(bp); setNextNode(*tail, *tail); return; } void *prev_bp, *next_bp; //link change prev_bp = getPrevNode(bp); next_bp = getNextNode(bp); setNextNode(prev_bp, next_bp); setPrevNode(next_bp, prev_bp); }
Node* CircularList::remove(Node& curr) { if (head != tail) { Node* n = head; Node* next; while (n->val != curr.val) { n = n->next; } next = n->next; if (n == head) { head = n->next; tail->next = head; delete n; n = 0; return next; } else { if (head->next == tail) { if (n == tail) { delete n; n = 0; tail = head; return head; } else { delete n; n = 0; head = tail; return head; } } Node* pre = getPrevNode(n); pre->next = next; delete n; n = 0; return next; } } return 0; }
// . get the node whose key is <= "key" // . returns -1 if none MemNode *MemPoolTree::getPrevNode ( MemKey &key ) { // return NULL if tree empty if ( ! m_headNode ) return NULL; // get the node MemNode *parent; MemNode *i = m_headNode ; while ( i ) { parent = i ; if ( key < i->m_key ) { i = i->m_left ; continue; } if ( key > i->m_key ) { i = i->m_right ; continue; } return i; } // if parent's key is < we're done if ( parent->m_key < key ) return parent; // otherwise we must get the node after the parent return getPrevNode ( parent ); }