Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<math.h>
- typedef struct tipoNo ptLSE;
- struct tipoNo{
- int numero;
- ptLSE *ant;
- ptLSE *prox;
- };
- ptLSE *cria_lista(void)
- {
- return NULL;
- }
- ptLSE *insere(ptLSE *ptLista, int n)
- {
- int n_elementos=0;//variável auxiliar que realiza a contagem do número de elementos
- ptLSE *novo;//novo elemento
- ptLSE *auxant;//ponteiro auxiliar para o elemento anterior.
- ptLSE *ptaux;
- int flag=0;
- ptaux=ptLista;
- novo=(ptLSE*)malloc(sizeof(ptLSE));//alocação de um novo nodo.
- novo->numero=n;
- if ((ptLista) == NULL) /*o anterior não existe, insere na primeira posição*/
- {
- ptLista = novo;//atualiza o início da lista.
- novo->prox = ptLista;//como a lista só tem 1 elemento,
- novo->ant = ptLista;
- }
- else
- {
- while (ptaux->prox!=ptLista)
- {
- auxant = ptaux;
- ptaux = ptaux->prox;
- n_elementos=n_elementos+1;
- }
- /*encaeia o elemento*/
- if(n>0)//testa se o número é positivo.
- {
- if(n%2==0)//caso no qual o número é positivo e par.
- {//insere o elemento no início da lista.
- novo->prox = ptLista;
- novo->ant = ptLista->ant;
- ptLista->ant->prox=novo;
- ptLista->ant=novo;
- ptLista = novo;
- }
- else//caso no qual o número é positivo e ímpar.
- {//insere o elemento no fim da lista.
- novo->prox=ptLista;
- ptaux->prox=novo;
- novo->ant=ptaux;
- ptLista->ant=novo;
- }
- }
- else//caso em que o número é negativo.
- {//insere o elemento no meio da lista.
- auxant=NULL;
- ptaux=ptLista;
- if(n_elementos%2!=0)
- {
- flag=1;
- }
- n_elementos=(int) floor(n_elementos/2);
- while(n_elementos!=0)
- {
- auxant = ptaux;
- ptaux = ptaux->prox;
- n_elementos=n_elementos-1;
- }
- if(flag==1)//caso o numero de elementos da lista seja impar, realiza mais uma vez o procedimento para coloca-lo na posicao correta.
- {
- auxant = ptaux;
- ptaux = ptaux->prox;
- }
- novo->ant=auxant;
- novo->prox=ptaux;
- auxant->prox=novo;
- ptaux->ant=novo;
- }
- }
- return ptLista;
- }
- ptLSE *destroi(ptLSE *ptLista)
- {
- ptLSE *ptaux;
- while(ptLista != NULL)
- {
- ptaux=ptLista;
- ptLista=ptLista->prox;
- free(ptaux);
- }
- return ptLista;
- }
- ptLSE *exibe(ptLSE *ptLista)
- {
- ptLSE *ptaux;
- ptaux = ptLista;
- printf("\nLista: ");
- if(ptLista==NULL)
- {
- printf("\nLista vazia.");
- }
- else
- {
- do{
- printf(" %d ",ptaux->numero);
- ptaux = ptaux->prox;
- }while(ptaux != ptLista);
- }
- return ptLista;
- }
- ptLSE *ExibeInversoNum(ptLSE *ptLista, int inverso)
- {
- ptLSE *ptaux;
- ptLSE *ptsucessor;
- ptaux = ptLista;
- if(ptLista==NULL) //caso a lista esteja vazia, informa o usuário e encerra a execução da função.
- printf("\nLista vazia.");
- else
- {
- do{
- ptaux = ptaux->prox;
- } while((ptaux != ptLista)&&(ptaux->numero != inverso)); //loop que encontra o número informado na lista
- if((ptaux == ptLista)&&(ptaux->numero!=inverso)) //no caso em que o número informado não se encontra na lista, informa o usuário.
- printf("\nO valor informado nao estava na lista. ");
- else //no caso em que o número informado se encontra na lista, exibe a lista gerada
- {
- printf("\nLista gerada pela funcao ExibeInverso: ");
- do{
- printf(" %d ",ptaux->numero);
- ptaux = ptaux->ant;
- }while(ptaux->numero != inverso);
- }
- }
- return ptLista;
- }
- int main()
- {
- ptLSE *ptLista;
- ptLista=cria_lista();
- int n=1;
- int inverso;
- while (n!=0)
- {
- printf("\nInsira o numero a ser inserido: ");
- scanf("%d", &n);
- if(n!=0)
- {
- ptLista=insere( ptLista, n);
- }
- }
- ptLista=exibe(ptLista);
- printf("\nInforme o numero inicial da funcao do inverso: ");
- scanf("%d", &inverso);
- ptLista=ExibeInversoNum( ptLista, inverso);
- ptLista=destroi(ptLista);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment