GL4Dummies  0.1.7
Référence du fichier bin_tree.c

Fonctions de gestion d'arbres binaires. Plus de détails...

#include "bin_tree.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
Graphe des dépendances par inclusion de bin_tree.c:

Aller au code source de ce fichier.

Fonctions

pair_t btInsert (bin_tree_t **tree, void *data, int(*compar)(const void *newData, const void *nodeData))
 
pair_t btFind (bin_tree_t **tree, const void *data, int(*compar)(const void *newData, const void *nodeData))
 
bin_tree_t ** btFirst (bin_tree_t **ptr)
 
bin_tree_t ** btLast (bin_tree_t **ptr)
 
void btDelete (bin_tree_t **ptr, void(*freeData)(void *))
 
bin_tree_t ** btNext (bin_tree_t **ptr)
 
void btFree (bin_tree_t **tree, void(*freeData)(void *))
 
void btForAll (bin_tree_t *ptr, void(*todo)(void *, void **), void **ldata)
 

Description détaillée

Fonctions de gestion d'arbres binaires.

Auteur
Fares BELHADJ amsi@.nosp@m.ai.u.nosp@m.niv-p.nosp@m.aris.nosp@m.8.fr
Date
January 16, 2006 - June 01, 2010

Définition dans le fichier bin_tree.c.

Documentation des fonctions

◆ btDelete()

void btDelete ( bin_tree_t **  ptr,
void(*)(void *)  freeData 
)
63  {
64  bin_tree_t * todelete = *ptr, ** ptr2 = ptr, * lrc;
65  if(todelete->lc) {
66  *ptr = todelete->lc;
67  (*ptr)->next = todelete->next;
68  lrc = (*ptr)->lc;
69  while(lrc) {
70  lrc->next = ptr;
71  lrc = lrc->rc;
72  }
73  while((*ptr2)->rc) {
74  (*ptr2)->rc->next = todelete->next;
75  ptr2 = &((*ptr2)->rc);
76  }
77  (*ptr2)->rc = todelete->rc;
78  if(todelete->rc) {
79  lrc = todelete->rc->lc;
80  while(lrc) {
81  lrc->next = &((*ptr2)->rc);
82  lrc = lrc->rc;
83  }
84  }
85  } else {
86  *ptr = todelete->rc;
87  if(todelete->rc) {
88  lrc = todelete->rc->lc;
89  while(lrc) {
90  lrc->next = ptr;
91  lrc = lrc->rc;
92  }
93  }
94  }
95  if(freeData)
96  freeData(todelete->data);
97  free(todelete);
98 }

Références bin_tree_t::data, bin_tree_t::lc, bin_tree_t::next, et bin_tree_t::rc.

Référencé par gl4duDeleteMatrix().

◆ btFind()

pair_t btFind ( bin_tree_t **  tree,
const void *  data,
int(*)(const void *newData, const void *nodeData)  compar 
)
32  {
33  pair_t res = {(void **)tree, -1};
34  while(*((bin_tree_t **)res.ptr)) {
35  if((res.compResult = compar(data, (*((bin_tree_t **)res.ptr))->data)) < 0)
36  res.ptr = (void **)&((*((bin_tree_t **)res.ptr))->lc);
37  else if(res.compResult > 0)
38  res.ptr = (void **)&((*((bin_tree_t **)res.ptr))->rc);
39  else
40  return res;
41  }
42  return res;
43 }

Références pair_t::compResult, et pair_t::ptr.

Référencé par findMatrix(), gl4duGenMatrix(), gl4duIsMatrix(), gl4duwBindWindow(), gl4duwCreateWindow(), et manageEvents().

◆ btFirst()

bin_tree_t** btFirst ( bin_tree_t **  ptr)
45  {
46  bin_tree_t ** f = ptr;
47  while(*ptr) {
48  f = ptr;
49  ptr = &((*ptr)->lc);
50  }
51  return f;
52 }

Référencé par btNext().

◆ btForAll()

void btForAll ( bin_tree_t ptr,
void(*)(void *, void **)  todo,
void **  ldata 
)
113  {
114  if(ptr->lc)
115  btForAll(ptr->lc, todo, ldata);
116  todo(ptr->data, ldata);
117  if(ptr->rc)
118  btForAll(ptr->rc, todo, ldata);
119 }

Références btForAll(), bin_tree_t::data, bin_tree_t::lc, et bin_tree_t::rc.

Référencé par btForAll(), gl4duSendMatrices(), et gl4duwMainLoop().

◆ btFree()

void btFree ( bin_tree_t **  tree,
void(*)(void *)  freeData 
)
104  {
105  if(!(*tree)) return;
106  if((*tree)->lc) btFree(&((*tree)->lc), freeData);
107  if((*tree)->rc) btFree(&((*tree)->rc), freeData);
108  freeData((*tree)->data);
109  free(*tree);
110  (*tree) = NULL;
111 }

Référencé par gl4duClean(), et quit().

◆ btInsert()

pair_t btInsert ( bin_tree_t **  tree,
void *  data,
int(*)(const void *newData, const void *nodeData)  compar 
)
13  {
14  bin_tree_t ** next = *tree ? (*tree)->next : NULL /* correspond au parent du dernier fils gauche */;
15  pair_t res = {(void **)tree, -1};
16  while(*((bin_tree_t **)res.ptr)) {
17  if((res.compResult = compar(data, (*((bin_tree_t **)res.ptr))->data)) < 0) {
18  next = (bin_tree_t **)res.ptr;
19  res.ptr = (void **)&((*((bin_tree_t **)res.ptr))->lc);
20  } else if(res.compResult > 0) {
21  res.ptr = (void **)&((*((bin_tree_t **)res.ptr))->rc);
22  } else
23  return res;
24  }
25  (*((bin_tree_t **)res.ptr)) = calloc(1, sizeof (bin_tree_t));
26  assert(*res.ptr);
27  (*((bin_tree_t **)res.ptr))->data = data;
28  (*((bin_tree_t **)res.ptr))->next = next;
29  return res;
30 }

Références pair_t::compResult, bin_tree_t::next, et pair_t::ptr.

Référencé par gl4duGenMatrix(), et gl4duwCreateWindow().

◆ btLast()

bin_tree_t** btLast ( bin_tree_t **  ptr)
54  {
55  bin_tree_t ** l = ptr;
56  while(*ptr) {
57  l = ptr;
58  ptr = &((*ptr)->rc);
59  }
60  return l;
61 }

◆ btNext()

bin_tree_t** btNext ( bin_tree_t **  ptr)
100  {
101  return (*ptr)->rc ? btFirst(&((*ptr)->rc)) : (*ptr)->next;
102 }

Références btFirst(), bin_tree_t::next, et bin_tree_t::rc.

pair_t::ptr
void ** ptr
Definition: bin_tree.h:23
btFree
void btFree(bin_tree_t **tree, void(*freeData)(void *))
Definition: bin_tree.c:104
bin_tree_t::lc
struct bin_tree_t * lc
Definition: bin_tree.h:30
bin_tree_t::rc
struct bin_tree_t * rc
Definition: bin_tree.h:30
bin_tree_t::next
struct bin_tree_t ** next
Definition: bin_tree.h:30
bin_tree_t::data
void * data
Definition: bin_tree.h:29
bin_tree_t
Definition: bin_tree.h:28
btFirst
bin_tree_t ** btFirst(bin_tree_t **ptr)
Definition: bin_tree.c:45
pair_t
Definition: bin_tree.h:22
pair_t::compResult
int compResult
Definition: bin_tree.h:24
btForAll
void btForAll(bin_tree_t *ptr, void(*todo)(void *, void **), void **ldata)
Definition: bin_tree.c:113