hp2FEM
0.1
|
00001 #ifndef ACLIST_H 00002 #define ACLIST_H 00003 00004 #include "acdp.h" 00005 00006 /* 00007 ** definicao de uma lista generica - Salgado - 08/93 00008 ** esta lista pode ser acessada livremente 00009 */ 00010 00011 /* 00012 ** Os metodos da classe estao no arquivo acList.CPP 00013 */ 00014 00015 typedef int (*fcmp) (void *, void *); // funcao de comparacao 00016 typedef void (*fprt) (FILE *, void *); // funcao de impressao 00017 00018 /* 00019 ** definicao de uma estrutura para representar o no' da lista generica 00020 ** Obs.: Tudo e' publico no no' da lista. 00021 ** E' responsabilidade do usuario usar corretamente. 00022 */ 00023 00024 class acNodeList 00025 { 00026 public: 00027 void *GetDados() 00028 { 00029 if (this) 00030 return(dados); 00031 else 00032 return(0); 00033 } 00034 00035 /* 00036 ** Este pointer permite andar livremente pela lista. 00037 ** Por este motivo, deve ser usado com cuidado. 00038 */ 00039 acNodeList *next; // pointer para o proximo no' 00040 void *dados; // pointer para os dados 00041 }; 00042 00043 class acList 00044 { 00045 protected: // para poder ter herdeiros 00046 acNodeList *head; // inicio da lista 00047 int sizedados; // numero de bytes dos dados 00048 int sizelist; // tamanho da lista (num. de nos) 00049 fcmp cmp; // funcao de comparacao 00050 fprt prt; // funcao de impressao 00051 void errorcmp(); // erro de comparacao 00052 void erroralloc(); // erro de alocacao 00053 void errorinit(); // erro de inicializacao 00054 void errorprt(); // erro de impressao 00055 00056 public: 00057 00058 /******************************************** 00059 * Construtor e destrutor da lista generica * 00060 ********************************************/ 00061 00062 /* 00063 ** Construtor 00064 ** 00065 ** Formas de uso: 00066 ** 00067 ** acList lista(sizeof(tipo)); 00068 ** Cria lista e armazena tamanho dos dados. 00069 ** Nao sera' permitida a insercao ordenada ou 00070 ** pesquisa. 00071 ** 00072 ** acList lista(sizeof(tipo), func_comp); 00073 ** Cria lista e armazena tamanho dos dados e 00074 ** a funcao de comparacao para pesquisa 00075 ** e insercao ordenada. 00076 ** 00077 ** acList lista(sizeof(tipo), func_comp, func_prt); 00078 ** Cria lista e armazena tamanho dos dados e 00079 ** funcoes de comparacao e impressao. 00080 ** 00081 ** acList lista(sizeof(tipo), func_prt); 00082 ** Cria lista e armazena tamanho dos dados e 00083 ** funcao de impressao. 00084 */ 00085 acList(int s) 00086 { 00087 head = 0; 00088 sizedados = s; 00089 cmp = 0; 00090 prt = 0; 00091 sizelist = 0; 00092 } 00093 00094 acList(int s, fcmp c) 00095 { 00096 head = 0; 00097 sizedados = s; 00098 cmp = c; 00099 prt = 0; 00100 sizelist = 0; 00101 } 00102 00103 acList(int s, fcmp c, fprt p) 00104 { 00105 head = 0; 00106 sizedados = s; 00107 cmp = c; 00108 prt = p; 00109 sizelist = 0; 00110 } 00111 00112 acList(int s, fprt p) 00113 { 00114 head = 0; 00115 sizedados = s; 00116 cmp = 0; 00117 prt = p; 00118 sizelist = 0; 00119 } 00120 00121 /* 00122 ** construtor sem parametros 00123 */ 00124 acList() 00125 { 00126 head = 0; 00127 sizedados = 0; 00128 cmp = 0; 00129 prt = 0; 00130 sizelist = 0; 00131 } 00132 00133 /* 00134 ** Destrutor 00135 ** 00136 ** Deleta os elementos da lista 00137 */ 00138 ~acList() 00139 { 00140 Clear(); 00141 } 00142 00143 00144 /*************************************** 00145 * Funcoes para inserir dados na lista * 00146 ***************************************/ 00147 00148 /* 00149 ** Funcao para inserir um no' sempre no inicio da lista. 00150 ** Deve-se passar um pointer para os dados a serem inseridos. 00151 ** 1 -> ok 00152 ** 0 -> erro 00153 */ 00154 int InsertFirst(void *a); 00155 00156 /* 00157 ** funcao para inserir um no' em uma lista ordenada. 00158 ** Deve-se passar um pointer para os dados a serem inseridos. 00159 ** Se inseriu o no' retorna 1. 00160 ** Se retornar 0 e porque tentou inserir um dado ja' existente. 00161 ** -1 -> erro 00162 */ 00163 int InsertSort(void *d); 00164 00165 /* 00166 ** Funcao para deletar ou inserir um no' 00167 ** Se o no' nao existe, insere e retorna 1 00168 ** Se o no' existe, deleta e retorna 0 00169 ** -1 -> erro 00170 */ 00171 int InsDelSort(void *d); 00172 00173 00174 /************************************* 00175 * Funcoes para deletar nos da lista * 00176 *************************************/ 00177 00178 /* 00179 ** Deleta o primeiro no' de uma lista qualquer 00180 */ 00181 void DelFirst(); 00182 00183 /* 00184 ** Deleta um no' de uma lista qualquer. 00185 ** Se deletou, retorna 1 e em caso contrario retorna 0 00186 ** -1 -> erro 00187 */ 00188 int DelNode(void *d); 00189 00190 /* 00191 ** Deleta um no' de uma lista ordenada. 00192 ** Se deletou, retorna 1 e em caso contrario retorna 0 00193 ** -1 -> erro 00194 */ 00195 int DelNodeSort(void *d); 00196 00197 00198 /******************************** 00199 * Funcoes de pesquisa na lista * 00200 ********************************/ 00201 00202 /* 00203 ** Pesquisa sequencial em qualquer lista. 00204 ** Se achou retorna pointer para o no' e em 00205 ** caso contrario 0. 00206 */ 00207 void *SearchSeq(void *d); 00208 00209 /* 00210 ** Pesquisa sequencial em lista ordenada. 00211 ** Se achou retorna pointer para o no' e em 00212 ** caso contrario 0. 00213 */ 00214 void *SearchSort(void *d); 00215 00216 /* 00217 ** Retorna um pointer para o primeiro no' de uma 00218 ** lista qualquer. 00219 */ 00220 void *GetFirst() 00221 { 00222 if (head) 00223 return(head->dados); 00224 else 00225 return(0); 00226 } 00227 00228 00229 /********************** 00230 * Funcoes auxiliares * 00231 **********************/ 00232 00233 00234 /* 00235 ** Funcao para limpar uma lista 00236 */ 00237 void Clear(); 00238 00239 00240 /* 00241 ** Retorna o numero de nos de uma lista 00242 */ 00243 int GetSize() 00244 { 00245 return sizelist; 00246 } 00247 00248 /* 00249 ** retorna inicio da lista 00250 */ 00251 acNodeList *GetHead() 00252 { 00253 return(head); 00254 } 00255 00256 /* 00257 ** Funcao para inicializar lista sem parametros 00258 */ 00259 void SetListData(int s) 00260 { 00261 head = 0; 00262 sizedados = s; 00263 cmp = 0; 00264 prt = 0; 00265 sizelist = 0; 00266 } 00267 00268 void SetListData(int s, fcmp c) 00269 { 00270 head = 0; 00271 sizedados = s; 00272 cmp = c; 00273 prt = 0; 00274 sizelist = 0; 00275 } 00276 00277 void SetListData(int s, fcmp c, fprt p) 00278 { 00279 head = 0; 00280 sizedados = s; 00281 cmp = c; 00282 prt = p; 00283 sizelist = 0; 00284 } 00285 00286 void SetListData(int s, fprt p) 00287 { 00288 head = 0; 00289 sizedados = s; 00290 cmp = 0; 00291 prt = p; 00292 sizelist = 0; 00293 } 00294 00295 void SetCmpFunc(fcmp c) 00296 { 00297 cmp = c; 00298 } 00299 00300 /* 00301 ** funcao para imprimir lista em arquivo 00302 */ 00303 int Print(FILE *fp); 00304 00305 /* 00306 ** funcao para verificar existencia de lista 00307 */ 00308 int Exist() 00309 { 00310 return(sizedados != 0); 00311 } 00312 00313 }; 00314 00315 #endif // ACLIST_H