Esempio n. 1
0
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);
}
Esempio n. 2
0
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 );
}