Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct Lista{ //sintaxe do typedef: typedef [tipo de dados atual] [nome pelo qual se vai passar a chamar]
  6.  
  7. int num;
  8. struct Lista *proximo, *anterior; //Ponteiros que apontam para um objecto do tipo struct Lista
  9. //(tal como int *p corresponde a um ponteiro que aponta para um objecto do tipo int)
  10. }Lista;
  11.  
  12. //Funções que criam e inserem listas
  13.  
  14. Lista *criaLista(); //Esta função devolve um ponteiro (*) que aponta para um objeto do tipo struct Lista (Lista)
  15.  
  16. int insereNum(Lista *); //Esta função não devolve nada, mas recebe um ponteiro que aponta para um objecto do tipo struct Lista,
  17. //neste caso, o primeiro elemento
  18.  
  19. //Função que mostra os numeros no ecrã
  20.  
  21. int mostraNum(Lista *);
  22.  
  23. //Funções que calculam média, mínimo e máximo
  24.  
  25. int avgLista(Lista *);
  26.  
  27. int minLista(Lista *); //Recebem todas o cabeçalho (o primeiro elemento) da lista que se pretende efetuar as operações
  28.  
  29. int maxLista(Lista *);
  30.  
  31. int main(void){
  32.  
  33. Lista *startLista = NULL; //Eu costumo inicializar todos os ponteiros com NULL, excepto em algumas situações.
  34. //Neste caso também dá jeito, porque facilmente se verifica se a lista tem alguma coisa
  35.  
  36. int esc;
  37.  
  38. do{
  39.  
  40. printf("\n\nOPCOES:\n\t1. Criar uma nova lista\n\t2. Inserir um numero\n\t3. Mostrar numeros introduzidos\n\t4. Media\n\t5. Minimo\n\t6. Maximo\n\t7. Sair\nIntroduza escolha: ");
  41. scanf("%d", &esc);
  42. fflush(stdin); //fflush(*FILE) força a limpeza do buffer de um stream (pode ser de um ficheiro,
  43. //neste caso é o de entrada, stdin)
  44.  
  45. switch(esc){
  46.  
  47. case 1:
  48. if(startLista!=NULL){
  49.  
  50. printf("Ja existe uma lista."); //Como inicializei startLista a NULL, é fácil verificar se existe ou nao uma lista
  51. break;
  52. }
  53.  
  54. startLista = criaLista(); //Tens de guardar sempre o primeiro elemento da lista. startLista é um ponteiro
  55. //do mesmo tipo que criaLista() (Lista*), logo pode-se igualar, ficando startLista com o
  56. //endereço do ponteiro devolvido
  57. break;
  58. case 2:
  59. if(startLista==NULL){
  60.  
  61. printf("Nao existe uma lista."); //Verificação rápida se já existe o primeiro elemento
  62. break;
  63. }
  64.  
  65. insereNum(startLista); //insereNum recebe o cabeçalho da lista ao qual as outras estão ligadas
  66. break;
  67. case 3:
  68. mostraNum(startLista); //Não é preciso verificar se startLista é NULL, porque se fôr, o ciclo for()
  69. //termina imediatamente e não apresenta nada no ecrã
  70. break;
  71. case 4:
  72. avgLista(startLista);
  73. break;
  74. case 5:
  75. minLista(startLista);
  76. break;
  77. case 6:
  78. maxLista(startLista);
  79. break;
  80. }
  81. }while(esc!=6);
  82. }
  83.  
  84. Lista *criaLista(){ //Esta função devolve um ponteiro (*) que aponta para um objeto do tipo struct Lista (Lista)
  85.  
  86. Lista *startLista = malloc(sizeof(Lista)); //Pede ao OS para reservar um bloco de memoria do tamanho do struct Lista (chamado Lista) e guarda o endereço desse bloco em startLista
  87. //startLista é um ponteiro para struct Lista, e para acedar aos dados desse struct é necessário usar "->"
  88. //startLista->num é a mesma coisa que (*startLista).num
  89. //Como startLista é um ponteiro, usando o * pode-se aceder ao objecto ao qual ele aponta, neste caso um struct. No entanto, "->" é muito mais fácil de perceber e usar
  90.  
  91. if(startLista!=NULL){ //No caso extremamente raro onde o OS não pode reservar memória, ou seja, malloc() devolve NULL
  92.  
  93. //Pede um numero ao utilizador e guarda-o no dado num do struct Lista, aqui apontado por startLista, logo guarda-o em startLista->num [ou (*startLista).num]
  94. printf("Introduza um numero: ");
  95. scanf("%d", &(startLista->num)); //startLista->num é um inteiro, logo o operador & tem de ser utilizado
  96. fflush(stdin);
  97.  
  98. //Ponteiros dentro do struct
  99.  
  100. //Como este é suposto ser o primeiro elemento, tanto como *anterior como *proximo apontam para NULL
  101. startLista->anterior = NULL;
  102. startLista->proximo = NULL;
  103. }
  104. else printf("Erro ao criar lista.");
  105.  
  106. return startLista; //Devolve o cabeçalho a guardar em startLista. Lembra-te que a menos que declares uma variavel global,
  107. //startLista do main() e este startLista são objectos diferentes, apesar de apontarem para a mesma coisa, e
  108. //terem o mesmo nome
  109. }
  110.  
  111. int insereNum(Lista *startLista){ //Esta função não devolve nada, mas recebe um ponteiro que aponta para um objecto do tipo struct
  112. //Lista, neste caso, o primeiro elemento
  113.  
  114. Lista *atualLista = NULL, *ultimaLista = NULL, *proximaLista = NULL, *novo = malloc(sizeof(Lista));
  115.  
  116. //Este for() vai percorrer a lista do inicio ao fim e só para quando a lista atual for NULL. Como a condição
  117. //atualLista!=NULL só é testada depois da iteração acontecer, atualLista no final vai ser igual a NULL,
  118. //sendo necessãrio usar ultimaLista = atualLista
  119. for(atualLista = startLista; atualLista!=NULL; atualLista = atualLista->proximo){
  120.  
  121. ultimaLista = atualLista;
  122. }
  123.  
  124. //Mesma coisa que em criaLista(), pede um numero e guarda no struct, só que em vez de o ponteiro se chamar startLista,
  125. //chama-se novo, são ponteiros para as mesmas coisas
  126. printf("Introduza um numero: ");
  127. scanf("%d", &(novo->num)); //novo->num é um inteiro, logo o operador & tem de ser utilizado
  128. fflush(stdin);
  129.  
  130. //Ponteiros dentro do struct
  131.  
  132. //Para guardar o anterior, em vez de só fazeres ultimaLista->proximo = novo, fazes também o oposto,
  133. //logo novo->anterior = ultimaLista
  134. ultimaLista->proximo = novo;
  135. novo->anterior = ultimaLista;
  136. novo->proximo = NULL; //Coloca sempre o proximo a apontar para NULL
  137. }
  138. //Função que mostra os numeros no ecrã
  139.  
  140. int mostraNum(Lista *startLista){
  141. Lista *novo, *ponteiro_1, *ponteiro_2;
  142. novo = startLista;
  143. while(novo!=NULL){
  144. ponteiro_1 = novo->proximo;
  145. ponteiro_2 = novo->anterior;
  146. printf("O numero e %d \n", novo->num);
  147. novo=novo->proximo;
  148. }
  149. }
  150.  
  151. //Funções que calculam média, mínimo e máximo
  152.  
  153. int avgLista(Lista *startLista){
  154. Lista *novo, *ponteiro_1, *ponteiro_2;
  155. novo = startLista;
  156. int valores = 0;
  157. int total = 0;
  158. int media;
  159. while(novo!=NULL){
  160. ponteiro_1 = novo->proximo;
  161. ponteiro_2 = novo->anterior;
  162. total += 1;
  163. valores = (novo->num) + valores;
  164. novo=novo->proximo;
  165. }
  166. media = valores/total;
  167. printf("A media e %d",media);
  168. }
  169.  
  170.  
  171. int minLista(Lista *startLista){ //Recebem todas o cabeçalho (o primeiro elemento) da lista que se pretende efetuar as operações
  172. Lista *novo, *ponteiro_1, *ponteiro_2;
  173. novo = startLista;
  174. int minimo,temp= (novo->num);
  175. while(novo!=NULL){
  176. ponteiro_1 = novo->proximo;
  177. ponteiro_2 = novo->anterior;
  178. minimo = (novo->num);
  179. if (minimo < temp){
  180. temp = minimo;
  181. }
  182. novo=novo->proximo;
  183. }
  184. printf("O valor minimo e %d",temp);
  185. }
  186.  
  187. int maxLista(Lista *startLista){
  188. Lista *novo, *ponteiro_1, *ponteiro_2;
  189. novo = startLista;
  190. int minimo,temp= (novo->num);
  191. while(novo!=NULL){
  192. ponteiro_1 = novo->proximo;
  193. ponteiro_2 = novo->anterior;
  194. minimo = (novo->num);
  195. if (minimo > temp){
  196. temp = minimo;
  197. }
  198. novo=novo->proximo;
  199. }
  200. printf("O valor maximo e %d",temp);
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement