Saturday, April 7, 2012

/*Alocação @ Lista inserção ordenada -*/


#include<stdio.h>
struct cel
{
    int dado;
    struct cel *NEXT;
};

typedef struct cel cel;

cel *Penultimo(cel**);
cel *Novo(void);
void Adiciona(cel**,cel**);
void ver(cel*);
void clrscr(void);
//void *Descarrega(cel**);
//void *Deleta(cel**);
//void varrer(cel**);
int main()
{
    cel *dado,*fim;
    fim = NULL;
    char opc;
    do
    {
        clrscr();
        printf("Escolha:\t[I]nserir\t[V]er\t\033[37m\033[40m[R]emover\033[0;0m\t[S]air\n# ");
        scanf("%c",&opc);
        switch(opc)
        {
            case 'i':
            case 'I': Adiciona(&dado,&fim);
            case 'v':
            case 'V': ver(dado); break;
            case 'r':
            case 'R': break;
            case 's':
            case 'S': return 0;
        }


    }while(1);

    return 1;

}

cel *Penultimo(cel **dado)
{
    if((*dado)->NEXT != NULL)
    {
        Penultimo(&(*dado)->NEXT);
    }
    else return (*dado);
}

cel *Novo()
{
    #include<stdlib.h>
    cel *dado;

    dado = (cel *) malloc(sizeof(cel));

    printf("Valor: ");

    scanf("%d",&dado->dado);

    dado->NEXT = NULL;

    return dado;
}

/*void Adiciona(cel **dado)
{
    if(!(*dado))
    {
        (*dado) = Novo();
    }
    else if((*dado)->NEXT != NULL)
    {
        Adiciona(&(*dado)->NEXT);
    }
    else
    {
        (*dado)->NEXT = Novo();
    }*/

void Adiciona(cel**inicio,cel **fim)
{
    cel *novo;
    novo = Novo();
    if(!(*inicio))
    {
        (*inicio) = novo;
        (*fim) = (*inicio);
    }
    else
    {
        (*fim) = Penultimo(&(*inicio));
        if(novo->dado < (*inicio)->dado)
        {
            novo->NEXT = (*inicio);
            (*inicio)  = novo;
        }
        else if(novo->dado > (*fim)->dado)
        {
            (*fim)->NEXT = novo;
        }
        else
        {
            cel *anterior,*aux;
            aux = (*inicio);
            while(novo->dado > aux->dado)
            {
                anterior = aux;
                aux = aux->NEXT;
            }
            anterior->NEXT = novo;
            novo->NEXT = aux;
        }
    }
    return;

}

//    return;
//}

void  ver(cel *dado)
{
    if(dado != NULL)
    {
        printf("%d\t",dado->dado);
        ver(dado->NEXT);
    }
    scanf("%*c");
    return;
}

void clrscr()
{
    #include<stdlib.h>
    #ifdef WIN32
        system("cls");
    #else
        system("clear");
    #endif
}

No comments:

Post a Comment