hp2FEM  0.1
include/acdp/actree.h
00001 #ifndef ACTREE_HPP
00002 #define ACTREE_HPP
00003 
00004 #include "acdp.h"
00005 
00006 typedef int  (*fcmp) (void *, void *);   // funcao de comparacao
00007 typedef void (*fprt) (FILE *, void *);   // funcao de impressao
00008 
00009 // definicao de uma classe para representar o no' da arvore generica
00010 class acNodeTree
00011     {
00012     friend class acTree;
00013 
00014     private:
00015         acNodeTree *l, *r;   // pointer para os filhos
00016         void *dados;         // pointer para os dados
00017     public:
00018         acNodeTree *GetLeft()  { return(l); }
00019         acNodeTree *GetRight() { return(r); }
00020         void *GetData()        { return(dados); }
00021     };
00022 
00023 
00024 class acTree
00025     {
00026     private:
00027         acNodeTree *head;    // inicio da arvore
00028         int        sizedados;      // numero de bytes dos dados
00029         fcmp       cmp;           // funcao de comparacao
00030         fprt       prt;           // funcao de impressao
00031         int        size_tree(acNodeTree *);
00032         void       Print(FILE *fp, acNodeTree *);
00033         void       cnivel(long nivel, acNodeTree *);
00034         void       setniv(long nivel, acNodeTree *);
00035         long       NumNiveis;     // numero de niveis
00036         long       *vecniv;  // vetor com niveis
00037         void       setvec (void **v, long &i, acNodeTree *t);
00038 //        void       setvec (void huge * huge *v, long &i, acNodeTree *t);
00039 //        acNodeTree *Rebuild (void huge * huge *v, long n);
00040         acNodeTree *Rebuild (void **v, long n);
00041         acNodeTree *resttree(long, FILE *);
00042         void       savetree(FILE *, acNodeTree *);
00043         void       errorcmp();    // erro de comparacao
00044         void       erroralloc();  // erro de alocacao
00045         void       errorinit();   // erro de inicializacao
00046         void       errorprt();    // erro de impressao
00047 
00048 
00049     public:
00050 
00051         // Funcao para retornar o inicio da arvore
00052         acNodeTree *GetHead() { return(head); }
00053 
00054 
00055         /*********************************************
00056         * Construtor e destrutor da arvore generica *
00057         *********************************************/
00058 
00059         /*
00060         ** Construtores
00061         **
00062         ** Formas de uso:
00063         **
00064         **      acTree tree(sizeof(tipo), func_comp);
00065         **              Cria tree e armazena tamanho dos dados e
00066         **              a funcao de comparacao para pesquisa e
00067         **              e insercao ordenada.
00068         **
00069         **      acTree tree(sizeof(tipo), func_comp, func_prt);
00070         **              Cria tree e armazena tamanho dos dados,
00071         **              da funcao de comparacao para pesquisa e
00072         **              e insercao ordenada e funcao de impressao/gravacao.
00073         */
00074         acTree()
00075             {
00076             head = 0;
00077             sizedados = 0;
00078             cmp = 0;
00079             prt = 0;
00080             }
00081 
00082         acTree(int s, fcmp c)
00083             {
00084             head = 0;
00085             sizedados = s;
00086             cmp = c;
00087             prt = 0;
00088             }
00089 
00090          acTree(int s, fcmp c, fprt p)
00091             {
00092             head = 0;
00093             sizedados = s;
00094             cmp = c;
00095             prt = p;
00096             }
00097 
00098         // Coloca dados em uma arvore criada sem argumentos
00099         void SetTreeData(int s, fcmp c)
00100             {
00101             head = 0;
00102             sizedados = s;
00103             cmp = c;
00104             prt = 0;
00105             }
00106 
00107         // Funcao para deletar todos os nos de uma arvore
00108         void Clear(acNodeTree *n = 0, int first = 1);
00109 
00110         // Funcao para deletar um no' a partir de uma chave
00111         // Se deletar retorna 1 e em caso contrario retorna 0
00112         int DelNode(void *);
00113 
00114         // Funcao para inserir um dado na arvore
00115         // Se inserir, retorna 1 e em caso contrario retorna 0
00116         // -1 -> erro
00117         int Insert(void *val);
00118 
00119         // funcao para inserir um dado na arvore
00120         // Se inserir, retorna o ponteiro para o no' criado
00121         // e em caso contrario, retorna NULL
00122         void *InsRet(void *val);
00123 
00124         // Funcao para inserir ou deletar um dado na arvore
00125         // Se inserir, retorna 1 e se deletar retorna 0
00126         // -1 -> erro
00127         int InsDel(void *val);
00128 
00129         // Funcao para retornar o tamanho de uma arvore
00130         int Size();
00131 
00132         // Funcao que retorna um pointer para um no'
00133         // se nao achar, retorna NULL
00134         void *Search(void *x);
00135 
00136         // grava ou imprime a arvore
00137         void Print(FILE *fp) { if (prt) Print(fp, head); }
00138 
00139         // grava arvore
00140         void Save(FILE *fp);
00141 
00142         // recurepa uma arvore
00143         void Restore(long n, FILE *fp);
00144 
00145         // imprime numero de niveis da arvore
00146         int PrintNivels(FILE *);
00147 
00148         // Rebalancea arvore
00149         void Balance();
00150 
00151         // Reordena arvore
00152         void Reorder();
00153 
00154         };
00155 
00156 
00157 #endif // ACTREE_HPP
 All Classes Files Functions Variables Typedefs Friends Defines