int interface_stdin( void ) {
	no *T = malloc(sizeof(no));
	if ( T ) inicializada(T) = 0;
	
	char 	c; 		/* comando dentre {i, r, b} */
	int 	v, 		/* parametro da {insercao, remocao, busca} */
		i=0, j=0; 	/* controle do buffer, para nao repetir strings 
			   	 * i: indica numero de comandos {i, r, b} chamados,
			   	 * j: indica o numero de impressoes.
			   	 * Portanto, sempre deve valer i=j. */
	
	do {
		scanf("%c", &c);
		switch (c) {
			case 'i':
				scanf("%d", &v);
				T = inserir(T, v);
				i++; 	/* um comando executado implica i <- i + 1,
					 * comentarios posteriormente suprimidos. */
			break;
			case 'r':
				scanf("%d", &v);
				T = balancia(remover(T, v));
				i++;
			break;
			case 'b':
				scanf("%d", &v);
				i++;
			break;
		}

		if ( c == 'i' || c == 'r' || c == 'b' )
			printf("%c %d\n", c, v);

		/* j eh o numero de iteracoes, que deve ser concordante com i, 
		 * senao, j sera decrementado posteriormente e nada sera impresso. */
		j++;

		/* previne impressoes duplicadas. */
		if ( i != j ) 
			j--;
		/* Se o comando for {insercao, remocao}, imprime a arvore */
		else if ( c != 'b' ) {
			escreve(T, PRE_ORDER);
			printf("\n");
		/* Se o comando for de busca, imprime os no's percorridos. */
		} else 
			imprime_lista(busca(T, calloc(AVL_ALTURA_MAX, sizeof(int)), v));
	} while ( c != 'q' && !feof(stdin) );

	finaliza(T); /* Destroi T. */

	return EXIT_SUCCESS;
}
int main()
{
    Lista*lst = inicializada();          //Inicializa NULL
    Lista*end1 = inicializada();         //Inicializa NULL
    int  valor_digitado, valor_retira,n;

    lst=insere_ordenado(lst,18);     //Insere em ordem os valores
    imprime(lst);                    //imprime o valor
    lst=insere_ordenado(lst,90);
    imprime(lst);
    lst=insere_ordenado(lst,47);
    imprime(lst);

    printf("Digite uma numero:");
    scanf("%d",&n);
    lst=insere_ordenado(lst, n);
    imprime(lst);

    printf("Entre com um numero para busca: \n");
    scanf("%d",&valor_digitado);
    end1 = busca(lst,valor_digitado);                  // Busca endereço do  numero digitado
    if(end1 != NULL)
        printf("O valor se encontra no endereço %p.\n",end1);
    else
        printf("Numero nao encontrado.\n");

    printf("Entre com o numero para retirar: ");
    scanf("%d",&valor_retira);
    retira(lst,valor_retira);                          // Retira o numero digitado
    imprime(lst);

    libera(lst);                             // libera a lista
    lst=NULL;                                // igual lista à NULL
    imprime(lst);

    return 0;
}
int interface_arquivo(FILE *fp) {
	if ( !fp ) return EXIT_FAILURE;

	no *T = malloc(sizeof(no));
	if ( T ) inicializada(T) = 0;

	char 	comando,				/* comando dentre {i, r, b} */
		*linha = malloc(256 * sizeof(char));	/* linha que contem o `comando' e o `valor' */
	int 	valor;					/* parametro do comando */

	do {
		fgets(linha, 16, fp);
		if ( !interpreta_linha(linha, &comando, &valor) || feof(fp) ) comando = 'q';
		if ( comando != 'q' ) printf("%c %d\n", comando, valor); 
		switch (comando) {
			case 'i':
				T = inserir(T, valor);
			break;
			case 'r':
				T = balancia(remover(T, valor));
			break;
			/* Comando `b' (busca) eh tratado posteriormente ao final da iteracao, 
			 * pois a arvore nao eh impressa. 
			 */
		}

		if ( comando != 'q' && comando != 'b' ) { /* Se o comando nao for para sair, imprime a lista */
			escreve(T, PRE_ORDER);
			printf("\n");
		} else if ( comando == 'b' ) /* Se o comando for de busca, imprime os no's percorridos. */
			imprime_lista(busca(T, calloc(AVL_ALTURA_MAX, sizeof(int)), valor));
	} while ( comando != 'q' ); 

	finaliza(T); /* Destroi T. */
	
	return EXIT_SUCCESS;
}