Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.57 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef int TipoL;
  5.  
  6. typedef struct ListaNo
  7. {
  8. TipoL info;
  9. struct ListaNo *prox;
  10. } * pListaNo;
  11.  
  12. typedef struct TLista
  13. {
  14. pListaNo primeiro, ultimo, iterador;
  15. int longitude;
  16. } * Lista;
  17.  
  18. Lista inicLista()
  19. {
  20.  
  21. Lista lst;
  22. lst = (Lista)malloc(sizeof(struct TLista)); // alocando a struct TLista
  23. lst->longitude = 0; // zero elmentos
  24. lst->iterador = NULL;
  25. lst->primeiro = NULL;
  26. lst->ultimo = NULL;
  27. return lst; // retorna o endereco onde a struct Lista foi alocada
  28. }
  29.  
  30. void primLista(Lista lst)
  31. {
  32. //por o iterador sobre o primeiro No da lista
  33. lst->iterador = lst->primeiro;
  34. }
  35.  
  36. void ultLista(Lista lst)
  37. {
  38. //por o iterador sobre o ultimo No da lista
  39. lst->iterador = lst->ultimo;
  40. }
  41.  
  42. void posLista(Lista lst, int pos)
  43. {
  44.  
  45. if (lst->longitude > 0 && pos >= 1 && pos <= lst->longitude)
  46. {
  47.  
  48. int i;
  49. for (i = 1, lst->iterador = lst->primeiro; i < pos; i++, lst->iterador = lst->iterador->prox)
  50. {
  51. }
  52. }
  53. else
  54. {
  55. lst->iterador = NULL; // iterador indefinido
  56. }
  57. }
  58.  
  59. int fimLista(Lista lst)
  60. {
  61.  
  62. return (lst->iterador == NULL);
  63. }
  64.  
  65. void segLista(Lista lst)
  66. {
  67.  
  68. if (lst->iterador == NULL)
  69. {
  70. printf("\n erro: iterador indefindio \n");
  71. }
  72. else
  73. {
  74. lst->iterador = lst->iterador->prox;
  75. }
  76. }
  77.  
  78. TipoL infoLista(Lista lst)
  79. {
  80. if (lst->iterador == NULL)
  81. {
  82. printf("\n erro: iterador indefinido \n");
  83. return NULL;
  84. }
  85. else
  86. return lst->iterador->info;
  87. }
  88.  
  89. int longLista(Lista lst)
  90. {
  91. return lst->longitude;
  92. }
  93.  
  94. //3 casos: Lista vazia, iterador sobre o ultimo elemento, iterador sobre um elemento intermediario
  95. void anxLista(Lista lst, TipoL elem)
  96. {
  97.  
  98. //tratamento de erro
  99. if (lst->iterador == NULL && lst->longitude > 0)
  100. {
  101. printf("\n erro: iterador indefinido e lista cheia \n");
  102. }
  103. else
  104. {
  105.  
  106. //alocar memória para o novoNo a ser adicionado
  107. pListaNo novoNo = (pListaNo)malloc(sizeof(struct ListaNo));
  108. novoNo->info = elem; // atribuir o elemento a ser armazenado
  109. novoNo->prox = NULL; // atribuir NULL para deixar o novoNo preparado
  110.  
  111. if (lst->longitude == 0) // lista vazia
  112. {
  113. //apontar para o novoNo
  114. lst->primeiro = novoNo;
  115. lst->ultimo = novoNo;
  116. lst->iterador = novoNo;
  117. lst->longitude++;
  118. }
  119. else if (lst->iterador == lst->ultimo) // iterador sobre o ultimo elemento
  120. {
  121. //por no campo prox do ultimo no o endereco do novoNo
  122. lst->iterador->prox = novoNo;
  123. //lst->ultimo->prox = novoNo;
  124. //atualizar o campo ultimo com o endereco do novoNo
  125. lst->ultimo = novoNo;
  126. //atualizar o campo iterador com o endereco do novoNo
  127. lst->iterador = novoNo;
  128. //incrementar a quantidade de nos
  129. lst->longitude++;
  130. }
  131. else //iterador sobre um noh intermediario
  132. {
  133. // o prox do novoNo aponta para o proximo Noh depois do iterador
  134. // fazer o prox do iterador apontar para o novoNo
  135. novoNo->prox = lst->iterador->prox;
  136. lst->iterador->prox = novoNo;
  137. lst->iterador = novoNo;
  138. lst->longitude++;
  139. }
  140. }
  141. }
  142.  
  143. //3 casos: Lista vazia, iterador sobre o primeiro elemento, iterador sobre qualquer outro elemento
  144. void insLista(Lista lst, TipoL elem)
  145. {
  146.  
  147. if (lst->iterador == NULL && lst->longitude > 0)
  148. {
  149. printf("\n erro: iterador indefinido e lista cheia \n");
  150. }
  151. else
  152. {
  153.  
  154. //alocar memória para o novoNo a ser adicionado
  155. pListaNo novoNo = (pListaNo)malloc(sizeof(struct ListaNo));
  156. novoNo->info = elem; // atribuir o elemento a ser armazenado
  157. novoNo->prox = NULL; // atribuir NULL para deixar o novoNo preparado
  158.  
  159. if (lst->longitude == 0) // lista vazia
  160. {
  161. //apontar para o novoNo
  162. lst->primeiro = novoNo;
  163. lst->ultimo = novoNo;
  164. lst->iterador = novoNo;
  165. lst->longitude++;
  166. }
  167. else if (lst->iterador == lst->primeiro) // iterador sobre o primeiro elemento
  168. {
  169. //novoNo->prox = lst->iterador;
  170. novoNo->prox = lst->primeiro;
  171. lst->primeiro = novoNo;
  172. lst->iterador = novoNo;
  173. lst->longitude++;
  174. }
  175. else //iterador sobre qualquer outro noh
  176. {
  177. //usar um segundo iterador para percorrer a lista e parar uma posicao antes do iterador
  178. pListaNo p;
  179. for (p = lst->primeiro; p->prox != lst->iterador; p = p->prox)
  180. {
  181. }
  182. //ao sair do for, p esta um noh antes do iterador
  183. //acertar os ponteiros
  184. novoNo->prox = lst->iterador;
  185. p->prox = novoNo;
  186. lst->iterador = novoNo;
  187. lst->longitude++;
  188. }
  189. }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement