Advertisement
Eduardo_Pires

lista encadeada (cadastral)

Aug 28th, 2022
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.36 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<stdbool.h>
  4.  
  5. // declaracao do no da *lista*
  6. typedef struct node Node;
  7. struct node {
  8.     char info;
  9.     Node *next;
  10. };
  11.  
  12. // declaracao da lista em si
  13. typedef struct lista Lista;
  14. struct lista {
  15.     Node *head;
  16. //    Node *last;
  17. };
  18.  
  19.  
  20. Node *newNode(bool *deuCerto)
  21. {
  22.     Node *n;
  23.  
  24.     n = malloc(sizeof(Node));
  25.     if (n == NULL) *deuCerto = false;
  26.     else *deuCerto = true;
  27.  
  28.     return n;
  29. }
  30.  
  31. void deleteNode(Node *n)
  32. {
  33.     if (n != NULL) free(n);
  34. }
  35.  
  36. Lista *criar(bool *deuCerto)
  37. {
  38.     Lista *L;
  39.  
  40.     L = malloc(sizeof(Lista));
  41.     if (L == NULL) *deuCerto = false;
  42.     else {
  43.         *deuCerto = true;
  44.         L->head = NULL; // lista vazia
  45.     }
  46.  
  47.     return L;
  48. }
  49.  
  50. bool cheia(Lista *L)
  51. {
  52.     return false;
  53. }
  54.  
  55. bool vazia(Lista *L)
  56. {
  57.     if (L->head == NULL) return true;
  58.     else return false;
  59. }
  60.  
  61. // Insere de maneira ordenada
  62. void insereOrd(Lista *L, char X, bool *deuCerto)
  63. {
  64.     Node *p, *paux, *pant;
  65.     bool ok;
  66.  
  67.     p = newNode(&ok); // nao vou tratar o erro se ok == false...
  68.     p->info = X;
  69.  
  70.     // primeiro caso: lista vazia
  71.     if (vazia(L) == true) {
  72.         p->next = NULL;
  73.         L->head = p;
  74.     } else {
  75.         // segundo caso: X serah o primeiro elemento
  76.         paux = L->head;
  77.         if (p->info < paux->info) {
  78.             p->next = paux;
  79.             L->head = p;
  80.         } else {
  81.             // terceiro caso: nao eh o primeiro
  82.             // procura a posicao na lista
  83.             while (p->info >= paux->info
  84.                     && paux != NULL) {
  85.                 // avanca na lista
  86.                 pant = paux;
  87.                 paux = paux->next;
  88.             }
  89.  
  90.             if (paux == NULL) {
  91.                 // (3.1) X serah o ultimo elemento
  92.                 p->next = NULL;
  93.                 pant->next = p;
  94.             } else {
  95.                 // (3.2) X serah um node intermediario
  96.                 p->next = paux;
  97.                 pant->next = p;
  98.             }
  99.         }
  100.     }
  101.     *deuCerto = true;
  102.     // No nosso caso, nao temos *deuCerto = false, pois nao tratamos
  103.     //   evetuais erros, como nao ter memoria para alocar um Node.
  104. }
  105.  
  106. void retira(Lista *L, char X, bool *deuCerto)
  107. {
  108.     Node *p, *anterior;
  109.     bool achou;
  110.  
  111.     p = L->head; // p = L
  112.     anterior = NULL;
  113.  
  114.     // avanca na lista
  115.     while ((p != NULL) && (p->info < X)) {
  116.         anterior = p;
  117.         p = p->next;
  118.     }
  119.  
  120.     if ((p != NULL) && (p->info == X))
  121.         achou = true;
  122.     else achou = false;
  123.  
  124.     if (achou == true) {
  125.         if (p != L->head) {
  126.             anterior->next = p->next;
  127.             deleteNode(p);
  128.             p = NULL;
  129.             anterior = NULL;
  130.         } else {
  131.             //L->head = L->head->next;
  132.             L->head = p->next;
  133.             deleteNode(p);
  134.             p = NULL;
  135.         } // fim if-else
  136.         *deuCerto = true;
  137.     } else *deuCerto = false;
  138. }
  139.  
  140. void imprimeTodos(Lista *L)
  141. {
  142.     Node *p;
  143.  
  144.     p = L->head;
  145.  
  146.     while (p != NULL) {
  147.         printf("%c ", p->info);
  148.         p = p->next;
  149.     }
  150.     printf("\n");
  151. }
  152.  
  153. /* Exemplo de funcao para imprimir de maneira recursiva.
  154.  * No nosso exemplo, estamos usando Node cabeca; assim,
  155.  *   precisamos imprimir o conteudo de um Node.
  156.  * Por isso, em vez de termos uma funcao para imprimir lista,
  157.  *   criamos uma para imprimir o Node
  158.  */
  159. void imprimeRec(Node *N)
  160. {
  161.     // caso base, interrompe a funcao.
  162.     if (N == NULL) return;
  163.  
  164.     printf("%c ", N->info);
  165.     imprimeRec(N->next);
  166. }
  167.  
  168. /* Agora, fazemos a "interface", uma funcao que chama
  169.  *   a funcao recursiva.
  170.  * Essa eh a funcao que vai para o TAD, a outra eh
  171.  *   apenas uma auxiliar.
  172.  */
  173. void imprime(Lista *L)
  174. {
  175.     Node *p;
  176.  
  177.     p = L->head;
  178.     imprimeRec(p);
  179.     printf("\n");
  180. }
  181.  
  182. int main()
  183. {
  184.     Lista *p;
  185.     bool deuCerto;
  186.  
  187.     p = criar(&deuCerto);
  188.     if (deuCerto == false) {
  189.         printf("Erro ao criar a lista\n");
  190.         exit(1);
  191.     }
  192.  
  193.     insereOrd(p, 'E', &deuCerto);
  194.     insereOrd(p, 'C', &deuCerto);
  195.     insereOrd(p, 'D', &deuCerto);
  196.     insereOrd(p, 'A', &deuCerto);
  197.     insereOrd(p, 'B', &deuCerto);
  198.     insereOrd(p, 'A', &deuCerto);
  199.     imprime(p);
  200.  
  201.     retira(p, 'D', &deuCerto);
  202.     imprime(p);
  203.  
  204.     retira(p, 'A', &deuCerto);
  205.     imprime(p);
  206.  
  207.  
  208.     /*while (!vazia(p)) {
  209.         desempilhar(p, &c, &deuCerto);
  210.         printf("%c\n", c);
  211.     }*/
  212.  
  213.     return 0;
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement