From 516407dc178a18459655c3bf8494c63d50d7ac92 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 19 Apr 2015 14:44:48 +0000 Subject: [PATCH] MAVL. FossilOrigin-Name: f26f99b639c39fb5f83a6c49ed681366c54b1abbf9f7ce3b713a7c5be29c073f --- src/capwap/mavl_del_all.c | 36 ++++++++++++++++++++ src/capwap/mavliter_next.c | 69 ++++++++++++++++++++++++++++++++++++++ src/capwap/mavliter_seek.c | 66 ++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 src/capwap/mavl_del_all.c create mode 100644 src/capwap/mavliter_next.c create mode 100644 src/capwap/mavliter_seek.c diff --git a/src/capwap/mavl_del_all.c b/src/capwap/mavl_del_all.c new file mode 100644 index 00000000..79b55bac --- /dev/null +++ b/src/capwap/mavl_del_all.c @@ -0,0 +1,36 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +#include "mavl.h" + +static void mavl_del_all0(struct mavl *t ,struct mavlnode * n) +{ + if (!n) + return; + mavl_del_all0(t,n->left); + mavl_del_all0(t,n->right); + mavlnode_destroy(t,n); +} + +void mavl_del_all(struct mavl *t) +{ + mavl_del_all0(t,t->root); + t->root=0; +} + + diff --git a/src/capwap/mavliter_next.c b/src/capwap/mavliter_next.c new file mode 100644 index 00000000..30960ca9 --- /dev/null +++ b/src/capwap/mavliter_next.c @@ -0,0 +1,69 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +/** + *@file + *@brief Implementation of mavliter_next + */ + +#include "mavl.h" + +/** + * Get the next element within an AVL Tree. + * @param i pointer to AVL Iterator + * @return the element or NULL if there is no next elemeent. + */ +void * mavliter_next(mavliter_t *i) +{ + + while ( i->stack_ptr) { + i->stack_ptr--; + i->cur=i->stack[i->stack_ptr]; + + if (!i->cur) + continue; + + if ((i->stack_ptr)&1) { + return i->cur->data; + } + break; + + } + + + if (!i->cur){ + return NULL; + } + + while(i->cur->left) { + /* push right branch */ + i->stack[i->stack_ptr++]=i->cur->right; + + /* push node */ + i->stack[i->stack_ptr++]=i->cur; + + i->cur=i->cur->left; + + } + + i->stack[i->stack_ptr++]=i->cur->right; + + return i->cur->data; +} + + diff --git a/src/capwap/mavliter_seek.c b/src/capwap/mavliter_seek.c new file mode 100644 index 00000000..61a64a0e --- /dev/null +++ b/src/capwap/mavliter_seek.c @@ -0,0 +1,66 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +/** + *@file + *@brief Implementation of mavliter_seek + */ + + +#include "mavl.h" + +/** + * Set an AVL Iterator to a specific position. + * @param i AVL Iterator + * @param d element to search for + * @return element found or NULL if not found + */ +void * mavliter_seek(mavliter_t *i,void *d) +{ + if (!i->root) + return NULL; + + i->cur=i->root; + i->stack_ptr=0; + + int rc; + while(i->cur) { + + rc = i->cmp(d,i->cur->data); + if (rc==0){ + i->stack[i->stack_ptr++]=i->cur->right; + i->stack[i->stack_ptr++]=i->cur; + return mavliter_next(i); + } + + if (rc<0) { + i->stack[i->stack_ptr++]=i->cur->right; + i->stack[i->stack_ptr++]=i->cur; + + i->cur=i->cur->left; + + } + if (rc>0) { + + i->cur=i->cur->right; + } + } + return NULL; +} + +