C/Visual C - arbol binario de busqueda

 
Vista:
sin imagen de perfil

arbol binario de busqueda

Publicado por Diego (150 intervenciones) el 30/09/2016 21:49:51
Estoy intentando adaptar el codigo de un arbol binario de busqueda de:
http://c.conclase.net/edd/index.php?cap=ejemplos#inicio
"Ejemplo de árbol binario de búsqueda en C"

Pero tengo problemas al intentar hacer que me libere un puntero char * del nodo antes de que libere el nodo completo.
Consola: gcc -Wall -o arbol.exe arbolABB.c

1
2
3
4
5
6
7
8
9
10
arbolABB.c: In function ‘Podar’:
arbolABB.c:73:29: error: request for member ‘linea’ in something not a structure or union
       Podar(&(*a)->izquierdo.linea);
                             ^
arbolABB.c:75:20: error: expected identifier before ‘(’ token
       Podar(&(*a)->(derecho.linea));
                    ^
arbolABB.c: In function ‘Mostrar’:
arbolABB.c:148:11: warning: format ‘%s’ expects argument of type ‘char *, but argument 2 has type ‘int’ [-Wformat=]
    printf("%s\n", **linea);

Codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
 
/* Estructuras y tipos */
typedef struct _nodo {
   uint64_t posicion;
   char * linea;
   struct _nodo *derecho;
   struct _nodo *izquierdo;
} tipoNodo;
 
typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;
 
/* Funciones con árboles: */
/* Insertar en árbol ordenado: */
void Insertar(Arbol *a, uint64_t posicion, char *linea);
/* Comprobar si el árbol está vacío: */
int Vacio(Arbol r);
/* Recorrer el árbolABB en orden: */
void InOrden(Arbol, void (*func)(char **));
 
/* Funciones auxiliares: */
void Podar(Arbol *a);
 
void Mostrar(char **linea);
 
int main()
{
   Arbol Arbol=NULL;
 
   char *nom1, *nom2, *nom3, *nom4;
 
   nom1 = (char *)malloc(sizeof(char) * 4);
   strcpy(nom1, "eva");
   *(nom1 + 3) = '\0';
   nom2 = (char *)malloc(sizeof(char) * 6);
   strcpy(nom1, "pedro");
   *(nom2 + 5) = '\0';
   nom3 = (char *)malloc(sizeof(char) * 5);
   strcpy(nom3, "juan");
   *(nom3 + 4) = '\0';
   nom4 = (char *)malloc(sizeof(char) * 5);
   strcpy(nom4, "adan");
   *(nom4 + 4) = '\0';
   /* Inserción de nodos en árbol: */
   Insertar(&Arbol, 10, nom1);
   Insertar(&Arbol, 5, nom2);
   Insertar(&Arbol, 12, nom3);
   Insertar(&Arbol, 4, nom4);
   Insertar(&Arbol, 7, nom1);
   Insertar(&Arbol, 3, nom2);
 
   /* Mostrar el árbol en tres ordenes distintos: */
   printf("InOrden: ");
   InOrden(Arbol, Mostrar);
   printf("\n");
   /* Liberar memoria asociada al árbol: */
   Podar(&Arbol);
   return 0;
}
 
/* Poda: borrar todos los nodos a partir de uno, incluido */
void Podar(Arbol *a)
{
   /* Algoritmo recursivo, recorrido en postorden */
   if(*a) {
      Podar(&(*a)->izquierdo.linea);
      Podar(&(*a)->izquierdo);
      Podar(&(*a)->(derecho.linea));
      Podar(&(*a)->derecho);
      free(*a);
      *a = NULL;
   }
}
 
/* Insertar un dato en el árbol ABB */
void Insertar(Arbol *a, uint64_t posicion, char *linea)
{
   pNodo padre = NULL;
   pNodo actual = *a;
 
   /* Buscar el dato en el árbol, manteniendo un puntero al nodo padre */
   while(!Vacio(actual) && (strcmp(linea, actual->linea) != 0)) {
      padre = actual;
      if(strcmp(linea, actual->linea) < 0){
      		actual = actual->izquierdo;
      }else if(strcmp(linea, actual->linea) > 0) actual = actual->derecho;
   }
 
   /* Si se ha encontrado el elemento, regresar sin insertar */
   if(!Vacio(actual)) return;
   /* Si padre es NULL, entonces el árbol estaba vacío, el nuevo nodo será
      el nodo raiz */
   if(Vacio(padre)) {
      *a = (Arbol)malloc(sizeof(tipoNodo));
      (*a)->posicion = posicion;
      (*a)->linea = linea;
      (*a)->izquierdo = (*a)->derecho = NULL;
   }
   /* Si el dato es menor que el que contiene el nodo padre, lo insertamos
      en la rama izquierda */
   else if(strcmp(linea, padre->linea) < 0) {
      actual = (Arbol)malloc(sizeof(tipoNodo));
      padre->izquierdo = actual;
      actual->posicion = posicion;
      actual->linea = linea;
      actual->izquierdo = actual->derecho = NULL;
   }
   /* Si el dato es mayor que el que contiene el nodo padre, lo insertamos
      en la rama derecha */
   else if(strcmp(linea, padre->linea) > 0) {
      actual = (Arbol)malloc(sizeof(tipoNodo));
      padre->derecho = actual;
      actual->posicion = posicion;
      actual->linea = linea;
      actual->izquierdo = actual->derecho = NULL;
  }
}
 
/* Recorrido de árbol en InOrden, aplicamos la función func, que tiene
   el prototipo:
   void func(char **);
*/
void InOrden(Arbol a, void (*func)(char **))
{
   if(a->izquierdo) InOrden(a->izquierdo, func);
   func(&(a->linea));
   if(a->derecho) InOrden(a->derecho, func);
}
 
 
 
/* Comprobar si un árbol es vacío */
int Vacio(Arbol r)
{
   return r==NULL;
}
 
/* Función de prueba para recorridos del árbol */
void Mostrar(char **linea)
{
   printf("%s\n", **linea);
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

arbol binario de busqueda

Publicado por Diego (150 intervenciones) el 30/09/2016 22:10:20
El error lo arreglé modificando la linea 75
cambio:
1
free((*a)->linea);

Pero a simple vista no veo por qué aparece el warning .
1
2
3
4
acus@acus-desktop:~/compilar/c$ gcc -Wall -o arbol.exe arbolABB.c
arbolABB.c: In function ‘Mostrar’:
arbolABB.c:147:11: warning: format ‘%s’ expects argument of type ‘char *, but argument 2 has type ‘int’ [-Wformat=]
    printf("%s\n", **linea);

De momento probé ejecutarlo y no funcionó correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar