예제 #1
0
void *lista_borrar_primero(lista_t *lista) {
	if (lista_esta_vacia(lista)) return NULL;
	nodo_t* nodo_a_borrar = lista->inicio;
	void* elemento = nodo_a_borrar->valor;
	lista->inicio = nodo_a_borrar->siguiente;
	lista->largo--;
	if (lista_esta_vacia(lista)) lista->fin = NULL;
	free(nodo_a_borrar);
	return elemento;
}
예제 #2
0
파일: lista.c 프로젝트: mfvazquez/TDAs
// Borra de la lista el elemento en donde se encuentra el iterador y 
// devuelve su valor. Devuelve NULL en caso de estar al final de la lista
// o que la lista esté vacía.
// Pre: la lista y el iterador fueron creados
// Post: Se elminó un elemento de la lista y se devolvió su valor. 
void *lista_borrar(lista_t *lista, lista_iter_t *iter)
{
	/* Retornamos NULL si esta al final de la lista */
	if (lista_iter_al_final(iter) || lista_esta_vacia(lista))
		return NULL;
	
	/* Retornamos lista_borrar_primero si el iterador está al comienzo
	 * de la lista */
	if (!iter->anterior){
		iter->actual = lista->primero->prox;
		return lista_borrar_primero(lista);
	}
	
	/* Creamos variables auxiliares para guardar su dato y liberarla */
	nodo_t* nodo_aux = iter->actual;
	void* dato_aux = nodo_aux->dato;
	
	/* Ubicamos el iterador en su nueva posicion actual */
	iter->actual = iter->actual->prox;
	iter->anterior->prox = iter->actual;
	if (!iter->actual)
		lista->ultimo = iter->anterior;
	lista->cantidad--;
	free(nodo_aux);
	return dato_aux;
}
int listar_fabricas(base_t* base,bool imprimir){
    int hora,minutos;
    fabrica_t* fabrica;
    fabrica_t* anterior;
    if (lista_esta_vacia(base->fabricasavisitar)){
        //creo una lista con las fabricas que voy a visitar
        anterior = heap_desencolar(base->cerradofabricas);
        lista_insertar_ultimo(base->fabricasavisitar,(void*)anterior);
        while (!heap_esta_vacio(base->cerradofabricas)){
            fabrica = heap_desencolar(base->cerradofabricas);
            if (fabrica->horarioentrada>=anterior->horariosalida){
                lista_insertar_ultimo(base->fabricasavisitar,(void*)fabrica);
                anterior = fabrica;
            }
        }
    }
    if (imprimir){
        printf("Cantidad: %zu\n",lista_largo(base->fabricasavisitar));
        lista_iter_t* iterador = lista_iter_crear(base->fabricasavisitar);
        while(!lista_iter_al_final(iterador)){
            fabrica = lista_iter_ver_actual(iterador);
            conversion_horario(&hora,&minutos,fabrica->horarioentrada);
            printf("%s,%02d:%02d,",fabrica->idfabrica,hora,minutos);
            conversion_horario(&hora,&minutos,fabrica->horariosalida);
            printf("%02d:%02d\n",hora,minutos);
            lista_iter_avanzar(iterador);
        }
        lista_iter_destruir(iterador);
    }
    return 0;
}
예제 #4
0
void *lista_borrar(lista_t *lista, lista_iter_t *iter) {
	void* dato_borrado;
	// Si la lista está vacía o recorrí toda la lista
	if (lista_esta_vacia(lista) || lista_iter_al_final(iter)) return NULL;
	// Si estoy en la primera posición del iterador
	else if (!iter->anterior) {
		dato_borrado = lista_borrar_primero(lista);
		iter->actual = lista->inicio;
	}
	// Si estoy en cualquier otra posición del iterador
	else {
		nodo_t *nodo_a_borrar = iter->actual;
		dato_borrado = nodo_a_borrar->valor;
		// Si estoy al final de la lista
		if (!iter->actual->siguiente) {
			iter->anterior->siguiente = NULL;
			iter->actual = NULL;
			lista->fin = iter->anterior;
		}
		// Si estoy en cualquier otra posición
		else {
			iter->anterior->siguiente = nodo_a_borrar->siguiente;
			iter->actual = nodo_a_borrar->siguiente; 
		}
		free(nodo_a_borrar);
		lista->largo--;
	}
	return dato_borrado;
}
예제 #5
0
파일: tdas.c 프로젝트: FacundoAcevedo/ABB
void *lista_borrar(lista_t *lista, lista_iter_t *iter)
{
	if (lista_esta_vacia(lista)) return NULL;

	nodo_t* puntero_auxiliar = iter->actual;
	void* dato_auxiliar = puntero_auxiliar->valor;
	
	if (iter->actual) iter->actual = (iter->actual)->ref;
	else return NULL;

	// Caso particular: borrar el primer elemento de la lista
	if (!(iter->anterior))
		lista->inicio = (lista->inicio)->ref;
	
	else {
		(iter->anterior)->ref = iter->actual;
		// Caso particular: borra el ultimo elemento de la lista
		if (!(iter->actual)) lista->fin = iter->anterior;
	}
	
	free (puntero_auxiliar);
	lista->largo -= 1;
	
	if (lista->largo == 0) lista->fin = NULL;
	
	return dato_auxiliar;
}
예제 #6
0
void lista_destruir(lista_t *lista, void destruir_dato(void *)) {
	while (!lista_esta_vacia(lista)) {
		void* elemento = lista_borrar_primero(lista);
		if (destruir_dato) destruir_dato(elemento);
	}
	free(lista);
}
예제 #7
0
파일: lista.c 프로젝트: nee47/backup
void lista_destruir(lista_t *lista, void destruir_dato(void *)){
  while (!lista_esta_vacia(lista)){
    if (destruir_dato)  destruir_dato(lista->primero->dato);
    lista_borrar_primero(lista);
  }
  free(lista);
}
예제 #8
0
// Elimina un elemento de la lista en la posicion actual del iterador
// Pre: el iterador y la lista fueron creados
// Post: devuelve un puntero al dato del nodo que fue borrado o NULL si algun parametro no es correcto
void* lista_borrar(lista_t *lista, lista_iter_t *iter)
{
    if(!lista || !iter || lista_iter_al_final(iter) || lista_esta_vacia(lista))
		return NULL;

    nodo_t *nodo = iter->nodo_act;
    void *dato = nodo->dato;

    // Caso 1: Iter al principio de la lista
    if(iter->nodo_ant == NULL)
    {

        lista->primero = iter->nodo_act->siguiente;
        iter->nodo_act = lista->primero;
    }
    else
    {
        iter->nodo_ant->siguiente = iter->nodo_act->siguiente;
        iter->nodo_act = iter->nodo_ant->siguiente;
    }

    free(nodo);
    lista->largo--;

    if(lista_largo(lista)==1)
        lista->ultimo = lista->primero;

    return dato;
}
예제 #9
0
bool preparar_pedidos(vector_t * vectorzonas, vector_t * vectorprecios){
	int i, lvacias=0;
	pedido_t *pedido;
	lista_iter_t *iter;
	lista_t* listaaux;
	
	int cantidad=vector_obtener_cantidad(vectorzonas);
	for (i=0; i<cantidad; i++){
		listaaux= (lista_t*) vector_obtener(vectorzonas, i);
		if(lista_esta_vacia(listaaux)==true){
			lvacias++;
			printf("No hay pedidos en la zona %d\n", i+1);
			}
		}
	
	if (lvacias==cantidad) return false;
	
	for (i=0; i<cantidad; i++){
		listaaux= (lista_t*) vector_obtener(vectorzonas, i);
		iter=lista_iter_crear(listaaux);
		while (lista_iter_al_final(iter)==false){	
			pedido=(pedido_t *)(lista_iter_ver_actual(iter));
			pedido->preparado=true;
			lista_iter_avanzar(iter);
			}
		lista_iter_destruir(iter);
		}
	return true;	
	}
예제 #10
0
파일: tdas.c 프로젝트: FacundoAcevedo/ABB
lista_iter_t *lista_iter_crear(const lista_t *lista)
{
    if (lista_esta_vacia(lista)) return NULL;
    lista_iter_t* iter = malloc(sizeof(lista_iter_t));
    iter->anterior = NULL;
    iter->actual = lista->inicio;
    return iter;
}
예제 #11
0
파일: lista.c 프로젝트: nee47/backup
bool lista_insertar_primero(lista_t *lista, void *dato){
  nodo_t* nodo = nodo_crear(dato);
  if (!nodo) return false;
  nodo->siguiente = lista->primero;
  if (lista_esta_vacia(lista))  lista->ultimo = nodo;
  lista->primero = nodo;
  lista->largo++ ;
  return true;
}
예제 #12
0
// Destruye la lista. Si se recibe la función destruir_dato por parámetro,
// para cada uno de los elementos de la lista llama a destruir_dato.
// Pre: la lista fue creada. destruir_dato es una función capaz de destruir
// los datos de la lista, o NULL en caso de que no se la utilice.
// Post: se eliminaron todos los elementos de la lista.
void lista_destruir(lista_t *lista, void destruir_dato(void*))
{
	while(!lista_esta_vacia(lista))
        	if(destruir_dato!=NULL)
				destruir_dato(lista_borrar_primero(lista));
		else
			lista_borrar_primero(lista);
	free(lista);
}
예제 #13
0
파일: lista.c 프로젝트: nee47/backup
void *lista_borrar_primero(lista_t *lista){
  if (lista_esta_vacia(lista))  return NULL;
  void* dato_salida = lista->primero->dato;
  nodo_t* aux = lista->primero->siguiente;
  free(lista->primero) ;
  lista->primero = aux;
  lista->largo --;
  if (!lista->primero) lista->ultimo = NULL;
  return dato_salida;
}
예제 #14
0
파일: tdas.c 프로젝트: FacundoAcevedo/ABB
void lista_destruir(lista_t *lista, void destruir_dato(void *)){
	if (lista==NULL) return;
	while (!lista_esta_vacia(lista)){
		void *borrado = lista_borrar_primero(lista);
		if (destruir_dato!= NULL){
			destruir_dato(borrado);	
			}
		}
    free(lista);
 }
int sesion_aplicar(sesion_t* sesion,base_t* basedatos){
    inscripcion_t* anotado;
    if (strcmp(sesion->padron,"00000")==0) return -1;
    while(!lista_esta_vacia(sesion->inscripciones)){
        anotado = (inscripcion_t*)lista_borrar_primero(sesion->inscripciones);
        inscribir(sesion->padron,anotado->curso,basedatos);
        destruir_inscripcion(anotado);
    }
    strcpy(sesion->padron,"00000");
    return 0;
}
예제 #16
0
bool lista_insertar_ultimo(lista_t *lista, void *dato) {
	nodo_t* nodo = nodo_crear(dato);
	if (!nodo) return false;
	if (lista_esta_vacia(lista)) {
		lista->inicio = nodo;
		lista->fin = nodo;
	}
	lista->fin->siguiente = nodo;
	lista->fin = nodo;
	lista->largo++;
	return true;
}
예제 #17
0
파일: tdas.c 프로젝트: FacundoAcevedo/ABB
void *lista_borrar_primero(lista_t *lista){
    if (lista_esta_vacia(lista)) return NULL;

    nodo_t *nodo_a_borrar = lista->inicio;
    void *valor = nodo_a_borrar->valor;
    lista->inicio= (nodo_a_borrar)->ref;
    
    free(nodo_a_borrar);
    lista->largo -=1;
    if (lista->largo == 0) lista->fin = NULL;
    return valor;
    }
예제 #18
0
// Saca el primer elemento de la lista. Si la lista tiene elementos, se quita el
// primero de la lista, y se devuelve su valor, si está vacía, devuelve NULL.
// Pre: la lista fue creada.
// Post: se devolvió el valor del primer elemento anterior, la lista
// contiene un elemento menos, si la lista no estaba vacía.
void* lista_borrar_primero(lista_t *lista)
{
	if(lista_esta_vacia(lista))
		return NULL;

	void* dato = lista_ver_primero(lista);

	nodo_t* nuevo_primero = lista->primero->siguiente;
	free(lista->primero);
	lista->largo--;
	lista->primero = nuevo_primero;
	return dato;
}
예제 #19
0
파일: lista.c 프로젝트: mfvazquez/TDAs
// Saca el primer elemento de la lista. Si la lista tiene elementos,
// se quita el primero de la lista, y se devuelve su valor, si está 
// vacía, devuelve NULL.
// Pre: la lista fue creada.
// Post: se devolvió el valor del primer elemento anterior, la lista
// contiene un elemento menos, si la lista no estaba vacía.
void *lista_borrar_primero(lista_t *lista)
{
	/* Verificamos si está vacía */
	if (lista_esta_vacia(lista))
		return NULL;
		
	/* Realizamos las modificaciones a la lista */
	nodo_t *nodo_aux = lista->primero;
	void *dato_aux = lista_ver_primero(lista);
	lista->primero = nodo_aux->prox;
	free(nodo_aux);
	lista->cantidad--;
	return dato_aux;
}
예제 #20
0
파일: tdas.c 프로젝트: FacundoAcevedo/ABB
bool lista_insertar_primero(lista_t *lista, void *dato){
	
	nodo_t* nuevo_nodo = nodo_crear(dato);
    if (nuevo_nodo == NULL) return false;
    if (lista_esta_vacia(lista)){
        lista->inicio = nuevo_nodo;
		lista->fin = nuevo_nodo;
		}
    else{
	    nuevo_nodo->ref = lista->inicio;
        lista->inicio = nuevo_nodo;
		}
	lista->largo += 1;
	return true; 
}
int valuar_juguetes_total(base_t* base){
    int totalsonrisas = 0;
    int sonrisasfabricas;
    fabrica_t* fabrica;
    //if (lista_esta_vacia(base->fabricasavisitar)) return -1; //la lista esta vacia y hay que ver cuales visitar antes
    if (lista_esta_vacia(base->fabricasavisitar)) listar_fabricas(base,false); //la lista esta vacia y hay que ver cuales visitar antes
    lista_iter_t* iterador = lista_iter_crear(base->fabricasavisitar);
    while (!lista_iter_al_final(iterador)){
        fabrica = (fabrica_t*)lista_iter_ver_actual(iterador);
        sonrisasfabricas = valuar_juguetes(base,fabrica->idfabrica);
        totalsonrisas = (totalsonrisas + sonrisasfabricas);
        lista_iter_avanzar(iterador);
    }
    lista_iter_destruir(iterador);
    return totalsonrisas;
}
예제 #22
0
파일: lista.c 프로젝트: mfvazquez/TDAs
// 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;
}
예제 #23
0
// Agrega un nuevo elemento al principio de la lista. Devuelve falso en caso de error.
// Pre: la lista fue creada.
// Post: se agregó un nuevo elemento a la lista, valor se encuentra al principio
// de la lista.
bool lista_insertar_primero(lista_t *lista, void* valor)
{
	nodo_t* nodo = malloc(sizeof(nodo_t));

	if(nodo == NULL)
		return false;

	lista->largo++;
	nodo->siguiente = lista->primero;
	nodo->dato = valor;

	if(lista_esta_vacia(lista))
		lista->ultimo = nodo;

	lista->primero = nodo;
	return true;
}
bool hash_iter_avanzar(hash_iter_t* iter) {
    //verifico no estar ya al final
    if (hash_iter_al_final(iter)) return false;
    //avanzo y verifico no estar ahora al final
    lista_iter_avanzar(iter->iter);
    if (!lista_iter_al_final(iter->iter)) return true;
    //como estoy al final de la lista, busco si tengo a donde seguir
    if (iter->posicion == (iter->hash->tamanio)-1) return false;
    //como lo tengo, busco
    size_t posicion = buscar_no_vacia(iter->hash,iter->posicion+1);
    if (!lista_esta_vacia(iter->hash->tabla[posicion])) {
        lista_iter_destruir(iter->iter);
        iter->iter = lista_iter_crear(iter->hash->tabla[posicion]);
        iter->posicion = posicion;
        return true;
    }
    return false;
}
예제 #25
0
파일: lista.c 프로젝트: mfvazquez/TDAs
// 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;
}
예제 #26
0
파일: 0.c 프로젝트: nee47/backup
void lista_destruir2(lista_t* lista, hash_destruir_dato_t destruir_dato){ // Funcion que cree parecida a la de la lista, ya que la otra no me servia
  if (lista_esta_vacia(lista)){
    free(lista);
    return;
  }
  if (destruir_dato){
    daton_t* aux = lista_borrar_primero(lista);
    free(aux->clave);
    destruir_dato(aux->dato);
    free(aux);
    lista_destruir2(lista, destruir_dato);
    return;
  }
  daton_t* aux2 = lista_borrar_primero(lista);
  free(aux2->clave);
  free(aux2);
  lista_destruir2(lista, destruir_dato);
}
예제 #27
0
파일: lista.c 프로젝트: mfvazquez/TDAs
// Destruye la lista. Si se recibe la función destruir_dato por parámetro,
// para cada uno de los elementos de la lista llama a destruir_dato.
// Pre: la lista fue creada. destruir_dato es una función capaz de destruir
// los datos de la lista, o NULL en caso de que no se la utilice.
// Post: se eliminaron todos los elementos de la lista.
void lista_destruir(lista_t *lista, void destruir_dato(void *))
{
	/* Declaro nodo_aux para recorrer la cola y nodo_para_destruir para 
	 * guardar el nodo que será destruido. */
	nodo_t *nodo_aux = lista->primero, *nodo_para_destruir;

	while(nodo_aux){
		
		/* Destruimos el dato del nodo si se recibe destruir_dato */
		if (destruir_dato && !lista_esta_vacia(lista))
			destruir_dato(nodo_aux->dato);
			
		nodo_para_destruir = nodo_aux;
		nodo_aux = nodo_aux->prox;
		free(nodo_para_destruir);
	}
	free(lista);
}
예제 #28
0
파일: 0.c 프로젝트: nee47/backup
void *hash_borrar(hash_t *hash, const char *clave){
  unsigned long indice = fh(clave,hash->largo);
  if (!hash->tabla[indice]) return NULL;
  lista_iter_t* iter_l = busqueda(hash->tabla[indice], clave);
  if (lista_iter_al_final(iter_l)) {
    lista_iter_destruir(iter_l);
    return NULL;
  }
  daton_t* aux = lista_iter_borrar(iter_l);
  void* dato_salida = aux->dato; 
  free(aux->clave);
  free(aux);
  hash->tam--;
  lista_iter_destruir(iter_l);
  if (lista_esta_vacia(hash->tabla[indice])){
    lista_destruir(hash->tabla[indice], NULL);
    hash->tabla[indice] = NULL;
  }
  if (hash->tam < 3 * hash->largo && hash->largo > TAM_INI) {
    unsigned long  nuevo_largo = hash->largo /  2;
    redimensionar(hash, nuevo_largo);
  }
  return dato_salida;
}
예제 #29
0
/* Pruebas */
void prueba_tipos() {

	// Declaro de variables
	lista_iter_t *iter;
	lista_t* lista;
	alumno_t* alumno1;
	alumno_t* alumno2;
	alumno_t* alumno3;
	int padron1=94111;
	int padron2=77777;
	int padron3=10104;

	// las inicializo
	lista = lista_crear();
	alumno1=alumno_crear(padron1);
	alumno2=alumno_crear(padron2);
	alumno3=alumno_crear(padron3);

	printf("---------------------------PRUEBAS---------------------------\n");

	//pruebo que este vacia
	print_test("Pruebo que la lista se crea vacía", lista_esta_vacia(lista) );

	//inserto 1er elemento
	print_test("Inserto primer elemento alumno1", lista_insertar_primero(lista,alumno1) );

	//inserto ultimo
	print_test("Inserto ultimo elemento alumno2", lista_insertar_ultimo(lista,alumno2) );

	//inesrto un nuevo ultimo
	print_test("Inserto ultimo elemento alumno3", lista_insertar_ultimo(lista,alumno3) );

	//veo el primero
	print_test("Veo el primer elemento(alumno1)", alumno1==lista_ver_primero(lista));

	//borro el primero y veo devuelta
	print_test("Borro el primero", lista_borrar_primero(lista));
	print_test("Veo el primer elemento(alumno2)", alumno2==lista_ver_primero(lista));

	//veo el largo de la lista
	print_test("Veo el largo de la lista (2)", 2==lista_largo(lista));

	//creo iterador
	iter= lista_iter_crear(lista);

	//pruebas del iterador
	print_test("Hago avanza al iterador", lista_iter_avanzar(iter));
	print_test("Veo elemento actual del iterador (alumno3)", alumno3==lista_iter_ver_actual(iter));
	print_test("Hago avanza al iterador", lista_iter_avanzar(iter));
	print_test("Veo si esta al final", lista_iter_al_final(iter));

	//pruebas de lista junto con iterador
	print_test("Inserto de nuevo alumno1", lista_insertar(lista,iter,alumno1));
	print_test("Lo borro", alumno1==lista_borrar(lista,iter));

	//inserto 1er elemento
	print_test("Inserto primer elemento alumno1", lista_insertar_primero(lista,alumno1) );
	//destruyo el iterador
	lista_iter_destruir(iter);
	//creo iterador
	iter= lista_iter_crear(lista);
	print_test("Destruyo iterador,lo creo devuelta y borro el primer elemento (alumno1)", alumno1==lista_borrar(lista,iter));
	destruir_dato(alumno1);
	//destruyo lista e iterador
	lista_iter_destruir(iter);
	lista_destruir(lista,destruir_dato);

}
예제 #30
0
void *lista_ver_primero(const lista_t *lista) {
	if (!lista_esta_vacia(lista)) return lista->inicio->valor;
	return NULL;
}