Ejemplo n.º 1
0
Archivo: abb.c Proyecto: fonse451/abb
bool abb_asignar(abb_t* arbol, nodo_t* nodo, const char* clave, void* dato){
    if (arbol->funcion_de_comparacion(clave,nodo->clave) == 0){
        nodo->dato = dato;
        return true;
    }
	
    if(arbol->funcion_de_comparacion(clave,nodo->clave)>0){
        if(!nodo->nodo_derecho){                                      //cmp si devuelve 0 son iguales
			nodo_t* nodo_auxiliar = crear_nodo();					                                     // - si el primero menor
            nodo_auxiliar->clave = strdup(clave);                       // + si el primero mayor
            if(!nodo_auxiliar->clave)return false;
            nodo_auxiliar->dato = dato;
            nodo->nodo_derecho= nodo_auxiliar;
            arbol->cantidad++;
            return true;
        }
        else{
            return abb_asignar(arbol,nodo->nodo_derecho,clave,dato);
        }
    }
    else{
        if (!nodo->nodo_izquierdo){
            nodo_t* nodo_auxiliar = crear_nodo();
            nodo_auxiliar->clave = strdup(clave);
            nodo_auxiliar->dato = dato;
            nodo->nodo_izquierdo = nodo_auxiliar;
            arbol->cantidad++;
        
            return true;
        }
        else{
            return abb_asignar(arbol,nodo->nodo_izquierdo,clave,dato);
        }
    }
}
Ejemplo n.º 2
0
void insertar(int nodo, int dato){
    if(clave[nodo]>dato){
        if(izq[nodo] == -1){
            izq[nodo] = crear_nodo(dato);
        } else {
            insertar(izq[nodo], dato);
        }
    } else {
        if(der[nodo] == -1){
            der[nodo] = crear_nodo(dato);
        } else {
            insertar(der[nodo], dato);
        }
    }
}
Ejemplo n.º 3
0
Archivo: abb.c Proyecto: fonse451/abb
bool abb_guardar(abb_t *arbol, const char *clave, void *dato){
    if (!arbol->raiz){
            nodo_t* raiz = crear_nodo();
            arbol->raiz = raiz;
            arbol->raiz->clave = strdup(clave);
            arbol->raiz->dato = dato;
            arbol->cantidad++;
            return true;
    }
    return abb_asignar(arbol,arbol->raiz,clave,dato);
}
Ejemplo n.º 4
0
int main(){
    int i,num;
    int array[1005];
    scanf("%d",&N);
    for(i=0; i<N; ++i){
        scanf("%d",&array[i]);
    }
    for(i=N-1; i>=0; --i){
        if(i==(N-1)){
            raiz = crear_nodo(array[i]);
        } else {
            insertar(raiz, array[i]);
        }
    }
    preorden(raiz);
    return 0;
}
Ejemplo n.º 5
0
// Agrega un nuevo elemento al principio de la lista. Devuelve falso 
// men caso de error.
// Pre: la lista fue creada.
// Post: se agregó un nuevo elemento a la lista, dato se encuentra al inicio
// de la lista.
bool lista_insertar_primero(lista_t *lista, void *dato)
{
	nodo_t* nodo_nuevo = crear_nodo(dato);
	if (!nodo_nuevo)
		return false;
	
	/*Si la lista esta vacía el nodo será el primero y último de la lista. */
	if (lista_esta_vacia(lista))
		insertar_lista_vacia(lista, nodo_nuevo);
	else{
		/* Asignamos a la primer posicion al nuevo nodo */
		nodo_nuevo->prox = lista->primero;
		lista->primero = nodo_nuevo;
	}
	lista->cantidad++;
	return true;
}
Ejemplo n.º 6
0
// Agrega un nuevo elemento al final de la lista. Devuelve falso 
// en caso de error.
// Pre: la lista fue creada.
// Post: se agregó un nuevo elemento a la lista, dato se encuentra al final
// de la lista.
bool lista_insertar_ultimo(lista_t *lista, void *dato)
{
	/* Creamos el nuevo nodo. */
	nodo_t* nodo_nuevo = crear_nodo(dato);
	if (!nodo_nuevo)
		return false;
	
	/*Si la lista esta vacía el nodo será el primero y último de la lista. */
	if (lista_esta_vacia(lista))
		insertar_lista_vacia(lista, nodo_nuevo);
	else{
		/* Obtenemos el ultimo nodo y le agregamos el nuevo nodo al miembro prox. */
		lista->ultimo->prox = nodo_nuevo;
		lista->ultimo = nodo_nuevo;
	}
	lista->cantidad++;
	return true;
}
Ejemplo n.º 7
0
/**************************************
Agrega_nodo:
Ingresa un nodo al arbol de parsing
tomando como referencia un nodo padre.
***************************************/
void Agrega_nodo (struct Tnodo **raiz, char *nombre) 
{ 
   struct Tnodo *nodo = crear_nodo (nombre); 
   if (raiz == &root) { 
      if (root == NULL) 
         root = nodo; 
      else { 
         struct Tnodo *ap;
         if (root->hijos == NULL){
                 root->hijos=nodo;
         }
         else{
         for (ap = root; ap->siguiente != NULL; ap = ap->siguiente) 
            ; 
         ap->siguiente = nodo; 
      } }
   } else {
     if(strcmp((*raiz)->nombre,nodo->nombre)==0){
           if ((*raiz)->siguiente == NULL) { 
          (*raiz)->siguiente = nodo; 
      } 
      else { 
      struct Tnodo *ap; 
      for (ap = (*raiz)->siguiente; ap->siguiente != NULL; ap = ap->siguiente) 
         ; 
      ap->siguiente = nodo; 
   }
      }
      else{
       if ((*raiz)->hijos == NULL) { 
          (*raiz)->hijos = nodo; 
      } 
      else { 
      struct Tnodo *ap; 
      for (ap = (*raiz)->hijos; ap->siguiente != NULL; ap = ap->siguiente) 
         ; 
      ap->siguiente = nodo; 
   }} }
    
} 
Ejemplo n.º 8
0
// Inserta un nuevo elemento a la lista en la posicion del iterador, 
// devuelve falso en caso de error.
// Pre: la lista y el iterador fueron creados.
// Post: se insertó un nuevo elemento en la lista.
bool lista_insertar(lista_t *lista, lista_iter_t *iter, void *dato)
{
	/* Creamos una variable para verificar que, en caso de ser usadas,
	 * insertar_primero o insertar_ultimo funcionaron correctamente */
	bool exito = true;
	
	/* Si el iterador está al principio de la lista o la lista
	 * está vacía, insertamos en el primero */
	if (!iter->anterior && (exito = lista_insertar_primero(lista, dato))){
		iter->actual = lista->primero;
		return true;
	}
	
	/* Si el iterador está al final de la lista insertamos en el ultimo */
	if (lista_iter_al_final(iter) && (exito = lista_insertar_ultimo(lista, dato))){
		iter->actual = lista->ultimo;
		return true;
	}
	
	/* El iterador no está al final ni al principio de la lista */
	if (exito){
		/* Creamos el nuevo nodo con el dato a insertar */
		nodo_t* nodo_nuevo = crear_nodo(dato);
		if (!nodo_nuevo)
			return false;
		
		/* Ubicamos el nuevo nodo en la posicion en donde se 
		 * encontraba el iterador, iter->actual pasa a ser el nuevo
		 * nodo insertado e iter->anterior se mantiene constante */
		nodo_nuevo->prox = iter->actual;
		iter->actual = nodo_nuevo;
		iter->anterior->prox = nodo_nuevo;
		lista->cantidad++;
		return true;
	}
	
	/* lista_insertar_primero o lista_insertar_ultimo devolvió false */
	return false;
}
Ejemplo n.º 9
0
nodo *poner_nodo(nodo *raiz, char *cadena)
{
  // Añade un nuevo nodo
  if ( raiz != NULL )
  {                   
    if ( strcmp( cadena, raiz->linea) < 0 ) // cadena es menor
      raiz->izq = poner_nodo(raiz->izq, cadena);
    else               
      raiz->der = poner_nodo( raiz->der, cadena );
  }
  else
  {
    raiz = crear_nodo();
    if ((raiz->linea = (char *) malloc(strlen(cadena) + 1)) == NULL)
    {
      perror("poner_nodo");
      exit(-1);
    }
    strcpy( raiz->linea, cadena );
    
  } 
  return raiz;
}
Ejemplo n.º 10
0
int ins_avl (struct nodo **raiz,int n)
{
	struct nodo *nuevo,*p,*q,*s,*pivote,*pp;
	int llave,altura;

	nuevo = crear_nodo(n);
	if (*raiz == NULL) {
		*raiz = nuevo;
		return (1);  /* el arbol tiene un solo nodo */
	}
	pp = q = NULL;
	pivote = p = *raiz;
	llave = nuevo->info;
	while (p != NULL) {
		if (p->bal) {
			pp = q;
			pivote = p;
		}
		if (llave == p->info) {
			free (nuevo);
			return (2); /* ya existe */
		}
		else {
				q = p;
				if (llave < p->info)
					p = p->izq;
				else p = p->der;
			}
	}
	if (llave < q->info)
		q->izq = nuevo;
	else q->der = nuevo;
	if (llave < pivote->info) {
		s = pivote->izq;
		altura  = 1;
	}
	else {
			s = pivote->der;
			altura = -1;
		}
	p = s;
	while (p != nuevo)
		if (llave < p->info) {
			p->bal = 1;
			p = p->izq;
		}
		else {
				p->bal = -1;
				p = p->der;
			}
	if (pivote->bal == 0)
		pivote->bal = altura;
	else if (pivote->bal + altura == 0)
			pivote->bal = 0;
		else {
				if (altura == 1)
					if (s->bal == 1)
						r_derecha (pivote,s);
					else dr_derecha (pivote,&s);
				else if (s->bal == -1)
						r_izquierda (pivote,s);
					else dr_izquierda (pivote,&s);
				if (pp == NULL)
					*raiz = s;
				else if (pp->izq == pivote)
						pp->izq = s;
					else pp->der = s;
			}
}
Ejemplo n.º 11
0
void main() {
   int choice;
   char ans = 'N';
   int key;

   Nodo *nuevo_nodo, *raiz, *tmp;
   raiz = NULL;

   system("clear");
 
   printf("\nPrograma para árbol de búsqueda binaria:");
   do {
      printf("\n1.Insertar");
      printf("\n2.Buscar");
      printf("\n3.Listar árbol");
      printf("\n4.Dibujar arbol");
      printf("\n5.Exit");
      printf("\nIndicar operación : ");
      scanf("%d", &choice);
 
      switch (choice) {
      case 1:
         do {
            nuevo_nodo = crear_nodo(1);
            
            printf("\nIngresar elemento : ");
            scanf("%d", &nuevo_nodo->clave);
            
            insertar(&raiz, &nuevo_nodo);
            
            printf("\nQuiere ingresar mas elementos?(y/n) : ");
            scanf(" %c", &ans);
         } while (ans == 'y');
         break;
 
      case 2:
         printf("\nIngresar clave a ser buscada : ");
         scanf("%d", &key);
 
         tmp = buscar(&raiz, key);
         if(tmp == NULL)
            printf("\nNo existe la clave en el árbol!!!");

         break;
 
      case 3:
         if (raiz == NULL) {
            printf("Arbol no está creado.");
         } else {
            printf("\nMostrar Inorder : ");
            inorder(&raiz);
            printf("\nMostrar Preorder : ");
            preorder(&raiz);
            printf("\nMostrar Postorder : ");
            postorder(&raiz);
         }
         break;
      case 4:
         dibujar_arbol(raiz);
         break;
      }
   } while (choice != 5);
}