去掉tree的cur_node,和迭代器相关的都共用迭代器的_cur_node节点指针了

This commit is contained in:
建峰 2025-04-25 00:56:25 +08:00
parent 768c6586d3
commit 3ed9fb8437
2 changed files with 55 additions and 52 deletions

View File

@ -68,7 +68,6 @@ struct _tree
stack_t stack; stack_t stack;
queue_t queue; queue_t queue;
struct _tree_node * cur_node;
struct _iterator _iter; struct _iterator _iter;

View File

@ -1157,15 +1157,12 @@ iterator_t tree_iter(struct _tree* self, enum _order order)
iter->_parent = self; iter->_parent = self;
iter->_cur = 0; iter->_cur = 0;
iter->_cur_node = self->_root; iter->_cur_node = self->_root;
self->cur_node = self->_root; self->_order = order;
self->stack->clear(self->stack); self->stack->clear(self->stack);
self->queue->clear(self->queue); self->queue->clear(self->queue);
self->_order = order;
switch (self->_order) switch (self->_order)
{ {
case ORDER_LEFT_PRE: case ORDER_LEFT_PRE:
@ -1257,16 +1254,10 @@ const void* tree_iter_next(struct _iterator* iter)
tree_t self = (tree_t)iter->_parent; tree_t self = (tree_t)iter->_parent;
void *obj = NULL; void *obj = NULL;
// base on linklist
// struct _tree_node * node = (struct _tree_node *)iter->_cur_node;
// if(node != NULL)
// {
// obj = node->obj;
// // iter->_cur_node = node->next;
// }
self->_iter._cur += 1; self->_iter._cur += 1;
struct _tree_node* cur_node = self->_iter._cur_node;
switch (self->_order) switch (self->_order)
{ {
case ORDER_LEFT_PRE: case ORDER_LEFT_PRE:
@ -1275,41 +1266,41 @@ const void* tree_iter_next(struct _iterator* iter)
struct _tree_node* node = NULL; struct _tree_node* node = NULL;
if (self->_order == ORDER_LEFT_PRE) if (self->_order == ORDER_LEFT_PRE)
{ {
while (!self->stack->empty(self->stack) || self->cur_node != NULL) while (!self->stack->empty(self->stack) || cur_node != NULL)
{ {
if (self->cur_node != NULL) if (cur_node != NULL)
{ {
node = self->cur_node; node = cur_node;
self->stack->push(self->stack, &self->cur_node); self->stack->push(self->stack, &cur_node);
self->cur_node = self->cur_node->left; cur_node = cur_node->left;
break; break;
} }
else else
{ {
self->stack->pop(self->stack, &self->cur_node); self->stack->pop(self->stack, &cur_node);
self->cur_node = self->cur_node->right; cur_node = cur_node->right;
} }
} }
} }
else else
{ {
while (!self->stack->empty(self->stack) || self->cur_node != NULL) while (!self->stack->empty(self->stack) || cur_node != NULL)
{ {
if (self->cur_node != NULL) if (cur_node != NULL)
{ {
node = self->cur_node; node = cur_node;
self->stack->push(self->stack, &self->cur_node); self->stack->push(self->stack, &cur_node);
self->cur_node = self->cur_node->right; cur_node = cur_node->right;
break; break;
} }
else else
{ {
self->stack->pop(self->stack, &self->cur_node); self->stack->pop(self->stack, &cur_node);
self->cur_node = self->cur_node->left; cur_node = cur_node->left;
} }
} }
} }
@ -1318,7 +1309,9 @@ const void* tree_iter_next(struct _iterator* iter)
{ {
return NULL; return NULL;
} }
return node->obj;
self->_iter._cur_node = cur_node;
obj = node->obj;
}break; }break;
case ORDER_LEFT_IN: case ORDER_LEFT_IN:
case ORDER_RIGHT_IN: case ORDER_RIGHT_IN:
@ -1326,38 +1319,38 @@ const void* tree_iter_next(struct _iterator* iter)
struct _tree_node* node = NULL; struct _tree_node* node = NULL;
if (self->_order == ORDER_LEFT_IN) if (self->_order == ORDER_LEFT_IN)
{ {
while (!self->stack->empty(self->stack) || self->cur_node != NULL) while (!self->stack->empty(self->stack) || cur_node != NULL)
{ {
if (self->cur_node != NULL) if (cur_node != NULL)
{ {
self->stack->push(self->stack, &self->cur_node); self->stack->push(self->stack, &cur_node);
self->cur_node = self->cur_node->left; cur_node = cur_node->left;
} }
else else
{ {
self->stack->pop(self->stack, &self->cur_node); self->stack->pop(self->stack, &cur_node);
node = self->cur_node; node = cur_node;
self->cur_node = self->cur_node->right; cur_node = cur_node->right;
break; break;
} }
} }
} }
else else
{ {
while (!self->stack->empty(self->stack) || self->cur_node != NULL) while (!self->stack->empty(self->stack) || cur_node != NULL)
{ {
if (self->cur_node != NULL) if (cur_node != NULL)
{ {
self->stack->push(self->stack, &self->cur_node); self->stack->push(self->stack, &cur_node);
self->cur_node = self->cur_node->right; cur_node = cur_node->right;
} }
else else
{ {
self->stack->pop(self->stack, &self->cur_node); self->stack->pop(self->stack, &cur_node);
node = self->cur_node; node = cur_node;
self->cur_node = self->cur_node->left; cur_node = cur_node->left;
break; break;
} }
} }
@ -1366,25 +1359,32 @@ const void* tree_iter_next(struct _iterator* iter)
{ {
return NULL; return NULL;
} }
return node->obj;
self->_iter._cur_node = cur_node;
obj = node->obj;
}break; }break;
case ORDER_LEFT_POST: case ORDER_LEFT_POST:
case ORDER_RIGHT_POST: case ORDER_RIGHT_POST:
{ {
if (!self->stack->empty(self->stack)) if (!self->stack->empty(self->stack))
{ {
self->stack->pop(self->stack, &self->cur_node); self->stack->pop(self->stack, &cur_node);
} }
else else
{ {
self->cur_node = NULL; cur_node = NULL;
}
if(cur_node != NULL)
{
self->_iter._cur_node = cur_node;
obj = cur_node->obj;
} }
return self->cur_node == NULL ? NULL : self->cur_node->obj;
}break; }break;
case ORDER_LEFT_BREADTH: case ORDER_LEFT_BREADTH:
case ORDER_RIGHT_BREADTH: case ORDER_RIGHT_BREADTH:
{ {
struct _tree_node* node = self->cur_node; struct _tree_node* node = cur_node;
queue_t queue = self->queue; queue_t queue = self->queue;
if (!queue->empty(queue) && node != NULL) if (!queue->empty(queue) && node != NULL)
{ {
@ -1411,18 +1411,24 @@ const void* tree_iter_next(struct _iterator* iter)
queue->push(queue, &node->left); queue->push(queue, &node->left);
} }
} }
self->cur_node = node; cur_node = node;
} }
else else
{ {
self->cur_node = NULL; cur_node = NULL;
}
if(cur_node != NULL)
{
self->_iter._cur_node = cur_node;
obj = cur_node->obj;
} }
return self->cur_node == NULL ? NULL : self->cur_node->obj;
}break; }break;
default: default:
{ {
}break; }break;
} }
return obj; return obj;
} }
@ -1453,7 +1459,6 @@ static bool tree_avl_init(struct _tree* self, uint32_t obj_size)
stack_free(&self->stack); stack_free(&self->stack);
return false; return false;
} }
self->cur_node = NULL;
self->_iter.hasnext = tree_iter_hasnext; self->_iter.hasnext = tree_iter_hasnext;
self->_iter.next = tree_iter_next; self->_iter.next = tree_iter_next;
@ -1511,7 +1516,6 @@ static bool tree_rb_init(struct _tree* self, uint32_t obj_size)
stack_free(&self->stack); stack_free(&self->stack);
return false; return false;
} }
self->cur_node = NULL;
self->_iter.hasnext = tree_iter_hasnext; self->_iter.hasnext = tree_iter_hasnext;
self->_iter.next = tree_iter_next; self->_iter.next = tree_iter_next;