ricco_soares

ED lab4

Apr 29th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.04 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. typedef struct tipoNo ptLSE;
  5. struct tipoNo{
  6. int numero;
  7. ptLSE *ant;
  8. ptLSE *prox;
  9. };
  10.  
  11.  
  12. ptLSE *cria_lista(void)
  13. {
  14. return NULL;
  15. }
  16.  
  17. ptLSE *insere(ptLSE *ptLista, int n)
  18. {
  19. int n_elementos=0;//variável auxiliar que realiza a contagem do número de elementos
  20. ptLSE *novo;//novo elemento
  21. ptLSE *auxant;//ponteiro auxiliar para o elemento anterior.
  22. ptLSE *ptaux;
  23. int flag=0;
  24. ptaux=ptLista;
  25. novo=(ptLSE*)malloc(sizeof(ptLSE));//alocação de um novo nodo.
  26. novo->numero=n;
  27. if ((ptLista) == NULL) /*o anterior não existe, insere na primeira posição*/
  28. {
  29. ptLista = novo;//atualiza o início da lista.
  30. novo->prox = ptLista;//como a lista só tem 1 elemento,
  31. novo->ant = ptLista;
  32. }
  33. else
  34. {
  35. while (ptaux->prox!=ptLista)
  36. {
  37. auxant = ptaux;
  38. ptaux = ptaux->prox;
  39. n_elementos=n_elementos+1;
  40. }
  41. /*encaeia o elemento*/
  42. if(n>0)//testa se o número é positivo.
  43. {
  44. if(n%2==0)//caso no qual o número é positivo e par.
  45. {//insere o elemento no início da lista.
  46. novo->prox = ptLista;
  47. novo->ant = ptLista->ant;
  48. ptLista->ant->prox=novo;
  49. ptLista->ant=novo;
  50. ptLista = novo;
  51. }
  52. else//caso no qual o número é positivo e ímpar.
  53. {//insere o elemento no fim da lista.
  54. novo->prox=ptLista;
  55. ptaux->prox=novo;
  56. novo->ant=ptaux;
  57. ptLista->ant=novo;
  58. }
  59. }
  60. else//caso em que o número é negativo.
  61. {//insere o elemento no meio da lista.
  62. auxant=NULL;
  63. ptaux=ptLista;
  64. if(n_elementos%2!=0)
  65. {
  66. flag=1;
  67. }
  68. n_elementos=(int) floor(n_elementos/2);
  69. while(n_elementos!=0)
  70. {
  71. auxant = ptaux;
  72. ptaux = ptaux->prox;
  73. n_elementos=n_elementos-1;
  74. }
  75. if(flag==1)//caso o numero de elementos da lista seja impar, realiza mais uma vez o procedimento para coloca-lo na posicao correta.
  76. {
  77. auxant = ptaux;
  78. ptaux = ptaux->prox;
  79. }
  80. novo->ant=auxant;
  81. novo->prox=ptaux;
  82. auxant->prox=novo;
  83. ptaux->ant=novo;
  84. }
  85. }
  86. return ptLista;
  87. }
  88.  
  89. ptLSE *destroi(ptLSE *ptLista)
  90. {
  91. ptLSE *ptaux;
  92. while(ptLista != NULL)
  93. {
  94. ptaux=ptLista;
  95. ptLista=ptLista->prox;
  96. free(ptaux);
  97. }
  98. return ptLista;
  99. }
  100.  
  101. ptLSE *exibe(ptLSE *ptLista)
  102. {
  103. ptLSE *ptaux;
  104. ptaux = ptLista;
  105. printf("\nLista: ");
  106. if(ptLista==NULL)
  107. {
  108. printf("\nLista vazia.");
  109. }
  110. else
  111. {
  112.  
  113. do{
  114. printf(" %d ",ptaux->numero);
  115. ptaux = ptaux->prox;
  116.  
  117. }while(ptaux != ptLista);
  118. }
  119. return ptLista;
  120. }
  121.  
  122. ptLSE *ExibeInversoNum(ptLSE *ptLista, int inverso)
  123. {
  124. ptLSE *ptaux;
  125. ptLSE *ptsucessor;
  126. ptaux = ptLista;
  127. if(ptLista==NULL) //caso a lista esteja vazia, informa o usuário e encerra a execução da função.
  128. printf("\nLista vazia.");
  129. else
  130. {
  131.  
  132. do{
  133. ptaux = ptaux->prox;
  134. } while((ptaux != ptLista)&&(ptaux->numero != inverso)); //loop que encontra o número informado na lista
  135.  
  136. if((ptaux == ptLista)&&(ptaux->numero!=inverso)) //no caso em que o número informado não se encontra na lista, informa o usuário.
  137. printf("\nO valor informado nao estava na lista. ");
  138. else //no caso em que o número informado se encontra na lista, exibe a lista gerada
  139. {
  140. printf("\nLista gerada pela funcao ExibeInverso: ");
  141.  
  142. do{
  143. printf(" %d ",ptaux->numero);
  144. ptaux = ptaux->ant;
  145. }while(ptaux->numero != inverso);
  146. }
  147. }
  148.  
  149. return ptLista;
  150. }
  151.  
  152. int main()
  153. {
  154. ptLSE *ptLista;
  155. ptLista=cria_lista();
  156. int n=1;
  157. int inverso;
  158. while (n!=0)
  159. {
  160. printf("\nInsira o numero a ser inserido: ");
  161. scanf("%d", &n);
  162. if(n!=0)
  163. {
  164. ptLista=insere( ptLista, n);
  165. }
  166. }
  167.  
  168. ptLista=exibe(ptLista);
  169.  
  170. printf("\nInforme o numero inicial da funcao do inverso: ");
  171.  
  172. scanf("%d", &inverso);
  173.  
  174. ptLista=ExibeInversoNum( ptLista, inverso);
  175.  
  176. ptLista=destroi(ptLista);
  177.  
  178. return 0;
  179.  
  180. }
Advertisement
Add Comment
Please, Sign In to add comment