Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/dataStructures/basic/ClistSet.cpp
Go to the documentation of this file.
00001 
00008 #include "ClistSet.h"
00009 
00010 namespace grafalgo {
00011 
00015 ClistSet::ClistSet(int n1) : Adt(n1) { makeSpace(n()); }
00016 
00018 ClistSet::~ClistSet() { freeSpace(); }
00019 
00023 void ClistSet::makeSpace(int size) {
00024         try { node = new lnode[size+1]; } catch (std::bad_alloc e) {
00025                 stringstream ss;
00026                 ss << "ClistSet::makeSpace: insufficient space for "
00027                    << size << "index values";
00028                 string s = ss.str();
00029                 throw OutOfSpaceException(s);
00030         }
00031         nn = size; clear();
00032 }
00033 
00035 void ClistSet::freeSpace() { delete [] node; }
00036 
00041 void ClistSet::resize(int size) {
00042         freeSpace();
00043         try { makeSpace(size); } catch(OutOfSpaceException e) {
00044                 string s; s = "ClistSet::resize:" + e.toString(s);
00045                 throw OutOfSpaceException(s);
00046         }
00047 }
00048 
00053 void ClistSet::expand(int size) {
00054         if (size <= n()) return;
00055         ClistSet old(this->n()); old.copyFrom(*this);
00056         resize(size); this->copyFrom(old);
00057 }
00058 
00061 void ClistSet::clear() {
00062         for (index i = 0; i <= n(); i++) {
00063                 node[i].next = node[i].prev = i;
00064         }
00065 }
00066 
00068 void ClistSet::copyFrom(const ClistSet& source) {
00069         if (&source == this) return;
00070         if (source.n() > n()) resize(source.n());
00071         else clear();
00072         for (index x = 0; x <= source.n(); x++) {
00073                 node[x].next = source.suc(x);
00074                 node[x].prev = source.pred(x);
00075         }
00076 }
00077 
00082 void ClistSet::remove(index i) {
00083         assert(0 <= i && i <= n());
00084         node[node[i].prev].next = node[i].next;
00085         node[node[i].next].prev = node[i].prev;
00086         node[i].next = node[i].prev = i;
00087 }
00088 
00089 
00097 void ClistSet::join(index i, index j) {
00098         assert(0 <= i && i <= n() && 0 <= j && j <= n());
00099         if (i == 0 || j == 0) return;
00100         node[node[i].next].prev = node[j].prev;
00101         node[node[j].prev].next = node[i].next;
00102         node[i].next = j; node[j].prev = i;
00103 }
00104 
00109 string& ClistSet::toString(string& s) const {
00110         index i, j; string s1;
00111         int *mark = new int[n()+1];
00112         s = "{";
00113         int cnt = 0;
00114         for (i = 1; i <= n(); i++) mark[i] = 0;
00115         for (i = 1; i <= n(); i++) {
00116                 if (mark[i]) continue; 
00117                 mark[i] = 1;
00118                 if (node[i].next == i) continue;
00119                 if (++cnt > 1) s += ", ";
00120                 s += "[";
00121                 s += Adt::item2string(i,s1);
00122                 for (j = node[i].next; j != i; j = node[j].next) {
00123                         mark[j] = 1;
00124                         s += " ";
00125                         s += Adt::item2string(j,s1);
00126                 }
00127                 s += "]";
00128         }
00129         s += "}";
00130         delete [] mark;
00131         return s;
00132 }
00133 
00134 } // ends namespace
 All Classes Files Functions Variables Typedefs Friends