Logo Search packages:      
Sourcecode: d4x version File versions

sort.cc

/*    WebDownloader for X-Window
 *    Copyright (C) 1999-2002 Koshelev Maxim
 *    This Program is free but not GPL!!! You can't modify it
 *    without agreement with author. You can't distribute modified
 *    program but you can distribute unmodified program.
 *
 *    This program 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.
 */

#include "sort.h"
#include "stdio.h"
#include "dbc.h"
tAbstractSortNode::tAbstractSortNode(){
      less=more=NULL;
};

tAbstractSortNode::~tAbstractSortNode(){
      //do nothing it is abstract
};

void tSortNode::print(){
      printf("%i",key);
};

int tSortNode::cmp(tAbstractSortNode *what){
      return(key - ((tSortNode *)what)->key);
};
// Abstractions

tAbstractSortTree::tAbstractSortTree() {
      Top=NULL;
      NUM=0;
};

void tAbstractSortTree::init() {
      Top=NULL;
      NUM=0;
};

int tAbstractSortTree::count() {
      return(NUM);
};

void tAbstractSortTree::simple_add(tAbstractSortNode **where,tAbstractSortNode *what) {
      DBC_RETURN_IF_FAIL(where!=NULL);
      DBC_RETURN_IF_FAIL(what!=NULL);
      tAbstractSortNode **temp=where;
      while (*temp) {
            if ((*temp)->cmp(what)<0)
                  temp=&((*temp)->more);
            else
                  temp=&((*temp)->less);
      };
      *temp=what;
};

void tAbstractSortTree::add(tAbstractSortNode *what) {
      DBC_RETURN_IF_FAIL(what!=NULL);
      if (what==NULL) return;
      NUM+=1;
      simple_add(&Top,what);
      what->less=what->more=NULL;
};

int tAbstractSortTree::empty(){
      return Top?0:1;
};

tAbstractSortNode *tAbstractSortTree::find(tAbstractSortNode *what) {
      if (what==NULL) return NULL;
      tAbstractSortNode **temp=&Top;
      while (*temp) {
            int a=(*temp)->cmp(what);
            if (a<0)
                  temp=&((*temp)->more);
            else {
                  if (a==0) {
                        return *temp;
                  };
                  temp=&((*temp)->less);
            };
      };
      return NULL;
};


void tAbstractSortTree::del(tAbstractSortNode *what) {
      if (what==NULL) return;
      NUM-=1;
      tAbstractSortNode **temp=&Top;
      while (*temp && *temp!=what) {
            if ((*temp)->cmp(what)<0)
                  temp=&((*temp)->more);
            else
                  temp=&((*temp)->less);
      };
      *temp=what->less;
      if (what->more) simple_add(temp,what->more);
};

tAbstractSortNode *tAbstractSortTree::max() {
      if (Top==NULL) return NULL;
      tAbstractSortNode *temp=Top;
      while (temp->more) {
            temp=temp->more;
      };
      return temp;
};

void tAbstractSortTree::foreach_rec(tAbstractSortNode *node,
                            d4xSortTreeFunc doit,void *data){
      tAbstractSortNode *more=node->more;
      if (node->less)
            foreach_rec(node->less,doit,data);
      doit(node,this,data);
      if (more)
            foreach_rec(more,doit,data);
};

void tAbstractSortTree::foreach(d4xSortTreeFunc doit,void *data){
      if (Top)
            foreach_rec(Top,doit,data);
};

tAbstractSortTree::~tAbstractSortTree() {
      //do nothing %))
};

// going from abstraction to reality


Generated by  Doxygen 1.6.0   Back to index