Advertisement
Ricarte

filaEncadeada.c

Jan 2nd, 2023
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.02 KB | None | 0 0
  1. #include "filaEncadeada.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6. Node *newNode(){ //cria um ponteiro para tipo Node, aloca ela dinamicamente via malloc, retorna NULL caso não haja memória, caso contrario retorna o ponteiro
  7.     Node *n;
  8.     // Se não conseguir alocar, retorna NULL
  9.     n = malloc(sizeof(Node));
  10.     return n;
  11. }
  12.  
  13. void deleteNode(Node *n){ // recebe um ponteiro para nó e libera o mesmo, caso não seja igual a NULL
  14.     if(n != NULL){
  15.         free(n);
  16.     }
  17. }
  18.  
  19. Lista *criarL(){ // cria um ponteiro para Lista, e o aloca via malloc depois retorna o mesmo, ou    NULL caso não possa alocar
  20.     Lista *L;
  21.     // Caso não possa alocar, retorna NULL
  22.     L = malloc(sizeof(Lista));
  23.     if(L != NULL){
  24.         L->head = NULL; // Lista vazia
  25.     }
  26.     return L;
  27. }
  28. bool cheia(Lista *L){ /* função feita somente para cumprir com os padrões do TAD, pois nesta
  29.                         *versão a Lista nunca ficará cheia. Porém caso queira ser feito poderia ser *limitada a quantidade de elementos por meio desta função*/
  30.                        
  31.     return false; // enquanto ouver memória a Lista jamais estará cheia
  32. }
  33.  
  34. bool vazia(Lista *L){ // a lista só estará vazia, se a cabeça apontar para NULL
  35.     if(L->head == NULL){
  36.         return true;
  37.     }
  38.     return false;
  39. }
  40.  
  41. int tam(Lista *L){ // percorre uma lista, usando um nó aux, e pra cada "passagem" de nó, incrementa o contador, no momento que o aux for igual a NULL (final da lista), retorna o contador
  42.     int contador;
  43.     Node *aux = newNode();
  44.     aux = L;
  45.     while(aux != NULL){
  46.         contador++;
  47.         aux = aux->next;
  48.     }
  49.     return contador;
  50. }
  51.  
  52. bool inserirInicio(Lista *L, char x){ // insere um nó no inicio da lista
  53.     if (L == NULL || cheia(L) == true){
  54.         return false; // não conseguiu alocar a lista, ou a lista está cheia
  55.     }
  56.     Node *aux = newNode();
  57.     if(aux == NULL){
  58.         return false; // não conseguiu alocar um novo nó
  59.     }
  60.     aux->info = x; // nó recebe o valor de x
  61.     aux->next = L->head; // next agora aponta para a posição da cabeça
  62.     L->head = aux; // cabeça agora aponta para o nó
  63. }
  64.  
  65. bool inserirMeio(Lista *L, char x){ // insere um nó no meio da fila
  66.     if(L == NULL || cheia(L) == true){
  67.         return false; // não alocou a lista, ou a lista já está cheia
  68.     }
  69.     Node *aux = newNode(); // aloca um novo nó
  70.     if(aux == NULL){
  71.         return false; // nó não alocado
  72.     }
  73.     aux->info = x; // insere o valor de x no campo info
  74.     int meio = (tam(L) / 2); // encontra a quantidade necessaria para percorrer até o meio da lista
  75.     Node *p = newNode(); // declara um nó auxiliar
  76.     p = L->head;
  77.     for(int i = 1; i <= meio; i++){
  78.         p = p->next; // percorre a lista até o meio
  79.     }
  80.     aux->next = p->next; // novo elemento aponta para o proximo elemento a partir do meio
  81.     p->next = aux; // antigo meio da lista aponta para o novo meio
  82.     return true;
  83. }
  84.  
  85. bool inserirFim(Lista *L, char x){
  86.     if(L == NULL || cheia(L) == true){
  87.         return false; // lista não alocada, ou a lista está cheia
  88.     }
  89.     Node *aux = newNode(); // cria um novo nó
  90.     if(aux == NULL){
  91.         return false; // não conseguiu alocar o nó
  92.     }
  93.     aux->info = x;
  94.     Node *P = newNode(); // cria um nó auxiliar
  95.     P = L->head;
  96.     for(int i = 1; i <= tam(L); i++){
  97.         P = P->next; // percorre a lista até o final
  98.     }
  99.     aux->next = P->next; // novo nó agora aponta para NULL
  100.     P->next = aux; // antigo nó final agora aponta para o novo nó inserido
  101.     return true;
  102. }
  103.  
  104. bool removeInicio(Lista *L, char *x){
  105.     if(L == NULL || vazia(L) == true){
  106.         return false; // lista não alocada, ou a lista já está vazia
  107.     }
  108.     Node *Paux = newNode(); // cria um nó auxiliar
  109.     Paux = L->head;
  110.     L->head = L->head->next; // a cabeça agora aponta para o segundo elemento da lista (novo primeiro elemento)
  111.     deleteNode(Paux); // libera o antigo primeiro elemento da lista
  112.  
  113. }
  114.  
  115. bool removeMeio
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement