Exemplo n.º 1
0
Arquivo: abp.c Projeto: pbmartins/AlgC
void ABPInsertRec (PtABPNode *proot, int pelem)  /* inserção recursiva - recursive insertion */
{
	if (*proot == NULL)	/* inserir o elemento - inserting the element */
	{ if ((*proot = ABPNodeCreate (pelem)) == NULL) return; }
	else if ((*proot)->Elem > pelem)	/* subarvore esquerda - left subtree */
				ABPInsertRec (&(*proot)->PtLeft, pelem);
			else if ((*proot)->Elem < pelem)	/* subarvore direita - right subtree */
						ABPInsertRec (&(*proot)->PtRight, pelem);
					else { Error = REP_ELEM; return; }	/* o elemento já existe - element already exists */
}
Exemplo n.º 2
0
Arquivo: abp.c Projeto: pbmartins/AlgC
PtABPNode ABPCreateFile (char *nomef)
{
    PtABPNode ABP; FILE *PtF; unsigned int NElem, I, Elem;

    /* abertura com validacao do ficheiro para leitura - opening the text file for reading */
    if ( (PtF = fopen (nomef, "r")) == NULL) { Error = NO_FILE; return NULL; }

    ABP = ABPCreate ();    /* criação da arvore - creting the empty tree */

    /* leitura do número de elementos da arvore do ficheiro - reading the number of elements from the text file */
    fscanf (PtF, "%u", &NElem);
    if (NElem < 1) { Error = OK; fclose (PtF); return NULL; }

    /* leitura dos valores do ficheiro e carregamento da ABP */
    /* reading the elements from the text file and inserting them on the BST */
    for (I = 0; I < NElem; I++)
    {
        fscanf (PtF, "%d", &Elem);
        ABPInsertRec (&ABP, Elem);
        if (ABPErrorCode () == NO_MEM)
        { ABPDestroy (&ABP); Error = NO_MEM; return NULL; }
    }

    fclose (PtF);  /* fecho do ficheiro - closing the text file */

    Error = OK;
    return ABP;  /* devolve a arvore criada - returning the new tree */
}
Exemplo n.º 3
0
Arquivo: abp.c Projeto: pbmartins/AlgC
/*******************************************************************************
  Função recursiva que insere os elementos de uma lista numa arvore vazia de modo
  que ela fique balanceada.
  
  Recursive function that inserts an ordered array of elements in a tree in order
  that the is built a balanced tree.
*******************************************************************************/
static void Balance (PtABPNode *proot, int plist[], int pbegin, int pend)
{
	unsigned int Median;

	if (pbegin <= pend)
	{
		Median = (pbegin + pend) >> 1;	/* (pbegin+pend)/2 - calculating the middle position */
		ABPInsertRec (proot, plist[Median]);	/* inserir elemento central - insert the central element */
		Balance (proot, plist, pbegin, Median-1);	/* subarvore esquerda - left subtree */
		Balance (proot, plist, Median+1, pend);	/* subarvore direita - right subtree */
	}
Exemplo n.º 4
0
int main (void)
{
    PtABPNode abp, node; int value, error, sum; unsigned int count; char op;

    system ("clear");
    abp = ABPCreate ();

    do
    {
        printf ("Inserir-Inserting/Remover-Removing/Terminar-Terminating-> ");
        scanf ("%c", &op);
        scanf ("%*[^\n]"); scanf ("%*c");
        op = toupper (op);
    } while (op != 'I' && op != 'R' && op != 'T');

    while (op != 'T')
    {
        printf ("Valor (Value) -> ");
        scanf ("%d", &value);
        scanf ("%*[^\n]"); scanf ("%*c");

        if (op == 'I')
        {
            ABPInsertRec (&abp, value);
            if ((error = ABPErrorCode ()) != OK) printf ("Erro a inserir (Error in inserting) -> %s\n", ABPErrorMessage ());
        }
        else	if (op == 'R')
        {
            ABPDeleteRec (&abp, value);
            if ((error = ABPErrorCode ()) != OK) printf ("Erro a remover (Error in removing) -> %s\n", ABPErrorMessage ());
        }
        else
        {
            printf ("Erro na operacao escolhida - Error on the chosen operation\n");
            error = 1;
        }

        if (!error)
        {
            printf ("--------------------------------------------------------------------------------------------\n");
            if (ABPEmpty (abp)) printf ("\nArvore vazia! - Empty tree!\n");
            else ABPDisplay (abp);
            printf ("--------------------------------------------------------------------------------------------\n");
        }

        printf ("Inserir-Inserting/Remover-Removing/Terminar-Terminating-> ");
        scanf ("%c", &op);
        scanf ("%*[^\n]"); scanf ("%*c");
        op = toupper (op);
    }

    printf ("--------------------------------------------------------------------------------------------\n");
    if (ABPEmpty (abp)) printf ("Arvore vazia! - Empty tree!\n");
    else
    {
        ABPDisplay (abp);
        printf ("--------------------------------------------------------------------------------------------\n");
        printf ("Numero de nos da arvore (number of nodes) = %d\n", ABPSize (abp));
        printf ("Altura da arvore (tree height) = %d\n", ABPHeight (abp));
    }
    printf ("--------------------------------------------------------------------------------------------\n");

    node = ABPMinRep (abp);
    if (ABPErrorCode ()) printf ("Menor elemento da arvore (minimum element) = %s\n", ABPErrorMessage ());
    else printf ("Menor elemento da arvore (minimum element) = %d\n", ABPElement (node));

    node = ABPMaxRep (abp);
    if (ABPErrorCode ()) printf ("Maior elemento da arvore (maximum element) = %s\n", ABPErrorMessage ());
    else printf ("Maior elemento da arvore (maximum element) = %d\n", ABPElement (node));

    sum = ABPTotalSum (abp);
    if (ABPErrorCode ()) printf ("Soma dos elementos da arvore (Soma of the elements) = %s\n", ABPErrorMessage ());
    else printf ("Soma dos elementos da arvore (sum of the elements) = %d\n", sum);


    count = ABPEvenCount (abp);
    if (ABPErrorCode ()) printf ("Contagem dos elementos pares da arvore (number of even elements) = %s\n", ABPErrorMessage ());
    else printf ("Contagem dos elementos pares da arvore (number of even elements) = %d\n", count);

    sum = ABPMultSum (abp, 5);
    if (ABPErrorCode ()) printf ("Soma dos elementos da arvore multiplos de 5 (sum of elements multiple of 5) = %s\n", ABPErrorMessage ());
    else printf ("Soma dos elementos da arvore multiplos de 5 (sum of elements multiple of 5) = %d\n", sum);

    count = ABPOddCount (abp);
    if (ABPErrorCode ()) printf ("Contagem dos elementos impares da arvore (number of odd elements) = %s\n", ABPErrorMessage ());
    else printf ("Contagem dos elementos impares da arvore (number of odd elements) = %d\n", count);

    printf ("--------------------------------------------------------------------------------------------\n");
    printf ("Arvore listada em ordem (inorder traversal) ");
    ABPInOrderRec (abp);
    printf ("\n");
    printf ("--------------------------------------------------------------------------------------------\n");

    sum = ABPEvenOrderSum (abp);
    if (ABPErrorCode ()) printf ("Soma dos elementos com numero de ordem par da arvore (sum of elements with even order number) = %s\n", ABPErrorMessage ());
    else printf ("Soma dos elementos com numero de ordem par da arvore (sum of elements with even order number) = %d\n", sum);

    printf ("--------------------------------------------------------------------------------------------\n");
    printf ("Elementos impares da arvore por ordem crescente (odd elements by increasing order) ");
    ABPOddPrint (abp);
    printf ("\n");
    printf ("--------------------------------------------------------------------------------------------\n");

    printf ("\n");

    ABPDestroy (&abp);

    return 0;
}