Пример #1
0
Arv* arv_reconstroi (Arv* arv, Fila* preordem, infotype *vetDFS, infotype inicio, infotype tamanho){

    infotype pivo, x = 0;
   
   /* Enquanto houver elementos na fila do percorrimento preordem significa que ainda temos que
   percorrer a árvore e reconstrui-la */

    while (!fila_vazia(preordem)){

        x = fila_remove (preordem);

        arv = arv_insere (arv, x, arv);

        /* Encontramos o pivô do vetor DFS que representa a raiz da árvore */
        pivo = particiona (preordem, vetDFS, inicio, tamanho, x);

        /* Constrói subárvore esquerda recursivamente com a raiz da árvore sendo
        a raiz da subárvore esquerda */
        arv = arv_reconstroi (arv, preordem, vetDFS, inicio, pivo - 1);

        /* Constrói subárvore direita recursivamente com a raiz da árvore sendo
        a raiz da subárvore direita */
        arv = arv_reconstroi (arv, preordem, vetDFS, pivo + 1, tamanho);

    }

    return arv;
}
Пример #2
0
//---------------------------------------------------
main()
{
  tipo_fila *fila;
  int i, numero, maior;

  fila = (tipo_fila *) malloc (sizeof(tipo_fila));

  inicializar_fila(fila);

  for (i = 0; i < 5; i++)
    {
      printf("\nLeitura do valor (%d) : ", i + 1);
      scanf("%d", &numero);
      enqueue(numero, fila);
      //printf("Enfileirou: %d \n", numero);
    }

  if (fila_vazia(fila)) printf("Fila vazia");
  else mmm(&maior,fila);

  printf ("\nO maior valor da fila é : %d\n",maior);

  for (i = 0; i < 5; i++)
    {
      numero = dequeue(fila);
    }

getch ();
}
void inserir_ordenado(int p_valor, tipo_fila *fila)
{
  tipo_no *atual, *anterior, *aux;

  if (fila_vazia(fila)) enqueue(p_valor, fila);
  else 
  {
    if (p_valor < fila -> inicio -> valor)
    {
      aux            = (tipo_no *) malloc(sizeof(tipo_no));
      aux -> valor   = p_valor;
      aux -> prox    = fila -> inicio;
      fila -> inicio = aux;
    }
    else
    {
      atual    = fila -> inicio;
      anterior = atual;
      while ((atual -> valor < p_valor) & (atual != NULL))
      { 
        anterior = atual;
        atual    = atual -> prox;
      }

      aux              = (tipo_no *) malloc(sizeof(tipo_no));
      aux -> valor     = p_valor;
      anterior -> prox = aux;
      aux -> prox      = atual;
    }

    fila -> tamanho++;
  }
}  
Пример #4
0
Val apaga_fila(fila* f){
	Val total=criaValor(0);
	Chq Cheque;
	while (!fila_vazia(f)){
		Cheque = tira_first(f);
		total += valorCheque(Cheque);
		libertaCheque(Cheque);
	}
	free(f);
	return total;
}
int remover(Fila *f, void *y) 
{
    if(fila_vazia(*f))
        return ERRO_FILA_VAZIA;
    memcpy(y, f->dados[f->inicio], f->tamInfo);
    free(f->dados[f->inicio]);
    f->inicio++;
    f->num_ele--;
    if(f->inicio == f->capacidade)
        f->inicio = 0;
    return 0;
}
Пример #6
0
Arv* remover_fila(Fila *f)
{

    Arv *aux = NULL;
    if(fila_vazia(f) == 0)
    {
        aux = f->v[f->ini];
        f->ini = (f->ini+1)%MAX;
        f->qtde--;
    }
    return aux; // se fila vazia
}
Пример #7
0
void partida (char *x, fila *f)
{
 if (fila_vazia(f))
	{
	 printf("\n A fila esta vazia");
	 return;
	}
	 f -> tam = (( f -> tam) - 1 );
	 *x = f -> entradas[ f -> front ] ;
	 f -> front = ( ( f -> front ) + 1) % MAX_VETOR ;
	 return;
}
void mostra_fila(Fila f, void (*mostra_info)(void *)) 
{
    if(fila_vazia(f))
        return ERRO_FILA_VAZIA;
    int i = f.inicio;
    int n = f.num_ele;
    while(n--) 
    {
        mostra_info(f.dados[i]);
        i++;
        if (i == f.capacidade)
            i = 0;
    }
}
Пример #9
0
//retira elemento da fila
 Mala* fila_retira(Fila* f){
    Lista* t;
    Mala* m;
    if(fila_vazia(f)){
       printf("Fila Vazia!\n");
       exit(1);      
    }
    t = f->ini;
    m = t->info;
    f->ini = t->prox;
    if(f->ini == NULL)
       f->fim = NULL;
    free(t);
    return m;    
 }
Пример #10
0
int dequeue(tipo_fila *fila)
{
  tipo_no *q; int v;
  if (fila_vazia(fila))
  {
    printf("fila esta vazia\n");
    return 0;
  }
  q = fila -> inicio;
  v = fila -> inicio -> valor;
  fila -> inicio = fila -> inicio -> prox;
  free(q);
  fila -> tamanho--;
  return v;
}
Пример #11
0
void fila_pop(fila *f)
{
	filaItem *cabeca;

	if (f == NULL || fila_vazia(f))
		return;

	cabeca = f->cabeca;
	f->cabeca = cabeca->proximo;

	if (f->cabeca == NULL)
		f->cauda = NULL;
	
	free(cabeca->string);
	free(cabeca);
}
Пример #12
0
float fila_retira (Fila* f)
{
  Lista* t;
  float v;
  if (fila_vazia(f)) {
    printf("Fila vazia.\n");
    exit(1); } /* aborta programa */
  
  t = f->ini;
  v = t->info;
  f->ini = t->prox;
  if (f->ini == NULL) /* verifica se fila ficou vazia */
    f->fim = NULL;
  free(t);
 return v;
}
Пример #13
0
void enqueue(int x, tipo_fila *fila)
{
  tipo_no *aux;
  aux = (tipo_no *) malloc(sizeof(tipo_no));
  aux -> valor = x;
  aux -> prox  = NULL;
  if (fila_vazia(fila))
  {
    fila -> inicio = aux;
    fila -> fim    = aux;
  }
  else
  {
    fila -> fim -> prox = aux;
    fila -> fim = aux;
  }
  fila -> tamanho++;
}
Пример #14
0
void copia (tipo_fila *fila, tipo_fila *fila2){
    tipo_no *aux,*aux2;
    aux2 = (tipo_no *) malloc(sizeof(tipo_no));
    aux = fila -> inicio;
    while (aux != NULL){
            aux2 -> valor = aux -> valor;

            aux2 -> prox = NULL;
            if (fila_vazia(fila2)){
                fila2 -> inicio = aux2;
                fila2 -> fim = aux2;
            }else{
            fila2 -> fim -> prox = aux2;
            fila2 -> fim = aux2;
            }
        fila2->tamanho++;
        aux = aux -> prox;
    }
}
Пример #15
0
void imprime_largura(Arv *raiz){
    Arv* aux;

    Fila fila;
    iniciar(&fila);
    if (raiz!=NULL){
        inserir_fila(&fila, raiz);
        while(fila_vazia(&fila)==0){
            aux = remover_fila(&fila);
            printf("%d.", aux->elem);
            if(aux->esq!=NULL)
                inserir_fila(&fila, aux->esq);
            if(aux->dir!=NULL)
                inserir_fila(&fila, aux->dir);
        }
    }    
    else
        printf("Arvore vazia!\n");
}
Пример #16
0
void ConferePercorrimentos (infotype *vetDFS, Fila* fila_preordem, infotype tamDFS, infotype tamPreordem){

    infotype i, x = 0;

    if (tamDFS != tamPreordem){

        printf("\nOs percorrimentos são diferentes.");
        exit(1);

    }

    printf("\nConferindo os dois percorrimentos...\n");
    while (!fila_vazia (fila_preordem)) {

        i = 0;
        
        x = fila_remove (fila_preordem);

        while (i <= tamDFS){

            if (vetDFS[i] != x){

                i++;

            }

            else 

                break;

        }

        if (i > tamDFS){

            printf("\nOs percorrimentos são diferentes.\n");
            exit(1);

        }
    }

    printf("\nOs percorrimentos são iguais, continuando...\n");
}
Пример #17
0
void separa_filas (Fila* f, Fila* f_prioridade, Fila* f_convencional)
{
  Lista* l = f->ini;
  
  if (!fila_vazia(f))
    {
      while (l != NULL)
	{	  
	  if ((2015 - l->info) >= 65)
	    {
	      fila_insere(f_prioridade, l->info);
	    }
	  else
	    {	  
	      fila_insere(f_convencional, l->info);
	    }
	  l = l->prox;
	}
    }
}
main()
{ 
  tipo_fila *fila;
  int numero;

  fila = (tipo_fila *) malloc (sizeof(tipo_fila));

  inicilizar_fila(fila);

  printf("\n\nDigite uma sequencia de numeros (0 finaliza)\n");
  scanf("%d", &numero);
  while (numero != 0)
  {
    inserir_ordenado(numero, fila);
    scanf("%d", &numero);
  }
  printf("\n");

  if (fila_vazia(fila)) printf("Fila Vazia");
  else imprimir_fila(fila); 

  getch();
}
Пример #19
0
void* requester(void* thr_data) {
	signal(SIGINT, ctrlHandler);
	int rc;

	rc = pthread_mutex_lock(&mutex);
	#ifdef DEBUG
	printf("Thread %lu created!\n", pthread_self());
	#endif

	int found, i;

	char dig[30];
	char awk[30];

	FILE* file;

	char* ip;

	struct thread_data t_d;
	t_d = *((struct thread_data*)thr_data);

	Local head_local = t_d.domains;

	Fila head_normal = t_d.normal;
	Fila aux_normal;
	Fila head_prior = t_d.prioridade;
	Fila aux_prior;

	
	while(1) {
		rc = pthread_cond_wait(&cond, &mutex);
		#ifdef DEBUG
		printf("Thread working ID = %lu\n", pthread_self());
		#endif

		if(fila_vazia(head_prior) == 0) { // Lista local nao vazia
			#ifdef DEBUG
			imprimir_fila(t_d.prioridade);
			#endif

			#ifdef DEBUG
			printf("LOCAL thread...\n");
			#endif

			aux_prior = head_prior->next;
			Local local = head_local->next;

			#ifdef DEBUG
			printf("Dominio = %s\n", aux_prior->query);
			#endif

			i = 0;
			found = 0;
			while(i<n_linhas && local != NULL){
				if(strcmp(aux_prior->query, local->addr) == 0) {
					ip = local->ip;
					found = 1;
					break;
				}
				local = local->next;
				i++;
			}

			if(found != 0) {
				sendReply(aux_prior->dns_id, aux_prior->query, inet_addr(local->ip), aux_prior->socket, aux_prior->origem);
			} else {
				printf("IP de endereco local pedido nao encontrado!\n.");
				sendReply(aux_prior->dns_id, aux_prior->query, inet_addr("0.0.0.0"), aux_prior->socket, aux_prior->origem);
			}
			eliminar_pedido(head_prior);
			printf("\n\n-- Waiting for DNS message --\n\n");
		} else {	// Não há pedidos locais -> Tratar dos externos!
			#ifdef DEBUG
			imprimir_fila(head_normal);
			#endif

			aux_normal = head_normal->next;
			
			strcpy(dig, "dig +short ");
			
			strcpy(awk, " | awk \"{ print ; exit }\"");

			strcat(dig, aux_normal->query);
			strcat(dig, awk);

			printf("dig = %s\n", dig);

			char buffer[100];

			if((file = popen(dig, "r")) == NULL) {
				perror("Error on pipe or fork.\n");
				exit(1);
			}

			fgets(buffer, 100, file);
			pclose(file);

			#ifdef DEBUG
			printf("IP is = %s\n", buffer);
			#endif

			printf("\nQUERY A TRATAR = %d\n", aux_normal->dns_id);
			printf("QUERY HEAD = %d\n", head_normal->next->dns_id);

			if(buffer != NULL && buffer[0] == '\0') {
				printf("IP nao encontrado... A enviar 0.0.0.0...\n");
				sendReply(aux_normal->dns_id, aux_normal->query, inet_addr("0.0.0.0"), aux_normal->socket, aux_normal->origem);
			} else {
				sendReply(aux_normal->dns_id, aux_normal->query, inet_addr(buffer), aux_normal->socket, aux_normal->origem);
			}
			eliminar_pedido(head_normal);
			printf("\n\n-- Waiting for DNS message --\n\n");
		}
	}
	rc = pthread_mutex_unlock(&mutex);
}
Пример #20
0
char* fila_front(fila *f)
{
	if (f == NULL || fila_vazia(f))
		return NULL;
	return f->cabeca->string;
}
Пример #21
0
bool pilha_vazia(pilha p)
{
	return fila_vazia(p->topo);
}
Пример #22
0
void ordenacaoExterna(int numerosArmazenados){

   /* FILE *arqOrdenado;
    arqOrdenado = fopen("arqOrdenado.txt", "r"); //arquivo a ser ordenado*/
    int i = 0;
    int w = 0;
    int z = 0;
    fila fp; // Fila de prioridade
    int *bs; // Buffer de saida
    tipo_buffer *be; // Buffer de entrada
    tipo_nodo aux,auxRetirada;
    int numeroRuns = numerosArmazenados/TAM_RUN; // Runs geradas
    int inserirBufferEntrada;

    if(numerosArmazenados%TAM_RUN > 0) // Se  teve resto tem que gerar mais uma Run pro resto
        numeroRuns++;

    printf("\nQtd de Runs(50 chaves): %d",numeroRuns);

    gerar_runs(numeroRuns,numerosArmazenados);

    //Alocando memoria para os buffers
    bs = (int*)malloc(sizeof(int)*numeroRuns);
    be = (tipo_buffer*)malloc(sizeof(tipo_buffer)*numeroRuns);

    //Criando fila de prioridade
    fp = cria_fila(numeroRuns);

    //---------------------------------ADICIONAR ELEMENTOS NO BUFFER DE ENTRADA
    printf("\n\n2 - Adicionando elementos no buffer de entrada");
    for (i=0;i<numeroRuns;i++){

        be[i].posAtual=0; /* Somente para armazenar o posição corrente do arquivo.
                                Para quando pegar novamente mais um elemento pegar na posição atual */

        //Total de elementos que este buffer podera pegar da RUN
       // if( (i < numeroRuns || numeroRuns == 1) && numerosArmazenados >= 50 )
        if(i!=numeroRuns-1 || (numerosArmazenados % TAM_RUN) == 0)
            be[i].totalElementos = TAM_RUN; // Run completa
        else
            be[i].totalElementos = numerosArmazenados % TAM_RUN; // Run com menos de TAM_RUM

        //Carregando os buffers de entrada e inserindo os itens de cada Run
        inserirBufferEntrada = inserirElementosBufferEntrada(be,i);
        if (!inserirBufferEntrada){
            be[i].posAtualBuffer=-1;
        }else {
            aux.chave = be[i].chave[0];
            aux.run = i;
            be[i].posAtualBuffer++;
            //printf("\nRecebendo aux.chave %d aux.run %d",aux.chave,aux.run);
            insere_fila(fp,aux,numeroRuns); // Coloca na fila o elemento de indice 0 do buffer de entrada
        }
    }

    //-----------------------------------INICIO DA ORDENAÇÃO EXTERNA
    printf("\n\n3 - Realizando ordenação externa");
    w = 0;
    while (fila_vazia(fp)){
        imprime_fila(fp);
        remove_fila(fp,&auxRetirada);
        printf("\nElemento retirado = %d do Buffer de Entrada %d ",auxRetirada.chave,auxRetirada.run);
        bs[w]=auxRetirada.chave;
        w++;

        //verifica se o buffer de saida esta cheio e imprime no arquivo resultado
        if (w==numeroRuns){
            gravar_resultado(bs,w);
            w=0;
        }

        z=0;
        while (z<numeroRuns){
            if (z==auxRetirada.run){
                if (be[z].posAtualBuffer==TAM_BUFFER)
                    if (!carregaBE(auxRetirada.run,be)){
                        be[z].posAtualBuffer=-1;
                        printf("\nBuffer de entrada %d foi carregado!",auxRetirada.run);
                        break;
                    }
                if (be[z].posAtualBuffer < be[z].totalBuffer){
                    auxRetirada.run=z;
                    auxRetirada.chave=be[z].chave[be[z].posAtualBuffer];
                    insere_fila(fp,auxRetirada,numeroRuns);
                    be[z].posAtualBuffer++;
                    printf("\nElemento inserido = %d no Buffer de Entrada %d ",auxRetirada.chave,auxRetirada.run);
                }
                break;
            }
            z++;
        }// fim while

        //getchar();
    }

    //verifica se o buffer de saida possui algum elemento restante e salva no arquivo resultado
    if (w!=0)
        gravar_resultado(bs,w);

//---------------------------------------------------
    imprime_fila(fp);

    //Finalizando a fila de prioridade
    termina_fila(fp);

    printf("\n\Final da Ordenacao Externa");

    //fclose(arqOrdenado);
}