void desembarque(Pilha* p){ Fila* f = getfila(); while(!pilha_vazia(p)){ Mala* m = pilha_pop(p); fila_insere(f,m); } imprime_fila(f); pilha_libera(p); fila_libera(f); printf("\nDesembarque Realizado com Sucesso!\n"); }
/* teste problema 1.1 */ void teste_11() { fila *f; pilha *p; f = fila_nova(10); fila_push(f, "F"); fila_push(f, "R"); fila_push(f, "O"); fila_push(f, "G"); printf("Fila: "); imprime_fila(f); p = fila_transforma(f); printf("Pilha: "); imprime_pilha(p); fila_apaga(&f); pilha_apaga(p); }
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); }