/* Katie Lewis * April 2004 * Note: In codeing this referred to code examples from Professor Kuenning * and Matt Gnaizda. * */ #include #include "node.hh" #include const int START_SIZE = 10; const int LEAF_SIZE = 1; /*------------------------------------------------------------------------*/ Node::Node() : loc(), numLinks(0), sizeLinksArray(0), links(NULL), isLeaf(false), leafLength(0), leafAngle(0) { } Node::Node(const Location& loc_) : loc(loc_), numLinks(0), sizeLinksArray(0), links(NULL), isLeaf(false), leafLength(0), leafAngle(0) { } Node::Node(const Location& loc_, int numLinksArray_) : loc(loc_), numLinks(0), sizeLinksArray(numLinksArray_), isLeaf(false), leafLength(0), leafAngle(0) { links = new Node*[sizeLinksArray]; for (int i = 0; i maxBranching) newSize = maxBranching; else newSize = START_SIZE; links = new Node*[newSize]; for (int i = 0; i < newSize; ++i) links[i] = NULL; links[0] = bpoint; ++numLinks; return true; } if (maxBranching > sizeLinksArray && numLinks+1 > sizeLinksArray) expandLinks(maxBranching); assert(sizeLinksArray >= numLinks+1); bool success = false; int freespot = 0; for (int i = sizeLinksArray; i >=0; --i) { if (links[i] == NULL) { success = true; freespot = i; } else if (links[i]->loc == bpoint->loc) return false; } if (success) { links[freespot] = bpoint; ++numLinks; } return success; } bool Node::addBetween(Node* insertee, const Location& child, const int& maxBranching) { if (isLeaf) //can't insert a node into a leaf return false; for (int i = 0; i < sizeLinksArray; ++i) { if (links[i]->loc == child) { bool success = insertee->add(links[i], maxBranching); links[i] = insertee; return success; } } return false; } void Node::expandLinks(const int& maxBranching) { assert(!isLeaf); assert(numLinks+1 > sizeLinksArray && maxBranching <= sizeLinksArray); assert(links != NULL); int newSize = 2*sizeLinksArray; if (newSize > maxBranching) newSize = maxBranching; Node** newLinks = new Node*[newSize]; for (int i = 0; i < sizeLinksArray; ++i) { newLinks[i] = links[i]; } for (int i = sizeLinksArray; i < newSize; ++i) { newLinks[i] = NULL; } links = newLinks; sizeLinksArray = newSize; } void Node::retractLinks() { int newSize = (int)(0.3*sizeLinksArray); assert(numLinks < newSize); Node** newLinks = new Node*[newSize]; int j =0; for (int i = 0; i < sizeLinksArray; ++i) { if (links[i] != NULL) { newLinks[j] = links[i]; ++j; } } links = newLinks; sizeLinksArray = newSize; } /*------------------------------------------------------------------------*/