MirandaWopps

exercsListaEncadeada

Jun 20th, 2022 (edited)
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // declarar aqui porque dai n tem problema
  6. typedef struct informacao Informacao;
  7. typedef struct no No;
  8. typedef struct pedido Pedido;
  9.  
  10. struct informacao {
  11.     int codigo;
  12.     char nome[51];
  13. };
  14.  
  15. struct no {
  16.     Informacao* info;
  17.     char    nome[20]; /* nome da pessoa */
  18.     char    sexo;     /* ‘H’ (homem) ou ‘M’ (mulher) */
  19.     No* prox;
  20. };
  21.  
  22. struct pedido {
  23.     int    matricula;
  24.     char tipoDoPedido[21];   /* “soc”, “ic”, “mest”, “dout” */
  25.     Pedido* prox;
  26. };
  27.  
  28. No* lst_cria(void) {
  29.     No* no;
  30.     no = NULL;
  31.     return no;
  32. }
  33.  
  34. Pedido* lst_cria_pedido(void) {
  35.     Pedido* no;
  36.     no = NULL;
  37.     return no;
  38. }
  39.  
  40. No* lst_insere(No* no, int cod, char* nome) {
  41.     No* novoNo = (No*)malloc(sizeof(No)); // aloca o ponteiro
  42.     if (novoNo == NULL) return 0;       // verifica se alocou certo
  43.  
  44.     novoNo->info = (Informacao*)malloc(sizeof(Informacao));
  45.     if (novoNo->info == NULL) exit(1); //  verifica se alocou certo
  46.  
  47.     novoNo->info->codigo = cod;  // Insere parametro cod.
  48.     strcpy(novoNo->info->nome, nome); // Insere parametro nome
  49.     novoNo->prox = no; // aponta para o proximo da lista
  50.  
  51.     return novoNo; // retorna o novo ponteiro agora com os valores insertos
  52. }
  53.  
  54. Pedido* lst_insere_pedido(Pedido* lista, int cod, char* tipoPedido) {   //
  55.     Pedido* novoNo = (Pedido*)malloc(sizeof(Pedido)); // aloca o ponteiro
  56.     if (novoNo == NULL) return 0;       // verifica se alocou certo
  57.  
  58.     novoNo->matricula = cod;  // Insere parametro cod.
  59.     strcpy(novoNo->tipoDoPedido, tipoPedido); // Insere parametro nome
  60.     novoNo->prox = lista; // aponta para o proximo da lista
  61.  
  62.     return novoNo; // retorna o novo ponteiro agora com os valores insertos
  63. }
  64.  
  65. void lista_exibe(No* lst) {
  66.     No* p;
  67.     for (p = lst; p != NULL; p = p->prox) {
  68.         printf("Cod: %d  Nome: %s\n", p->info->codigo, p->info->nome);
  69.     }
  70. }
  71.  
  72. void lista_exibe_produto(Pedido* lst) {
  73.     Pedido* p;
  74.     for (p = lst; p != NULL; p = p->prox) {
  75.         printf("matricula: %d  tipoDoPedido: %s\n", p->matricula, p->tipoDoPedido);
  76.     }
  77. }
  78.  
  79.  
  80. No* quebraAoMeio(No* lst) {
  81.     No* p, * ant = NULL;
  82.     int i, totpri = 0, tot;
  83.     tot = 0;
  84.  
  85.     for (p = lst; p != NULL; p = p->prox) {
  86.         tot++;
  87.         totpri = tot / 2;
  88.     }
  89.  
  90.     if (tot < 2) return NULL;
  91.  
  92.     if (tot % 2 != 2)
  93.         totpri++;
  94.  
  95.     p = lst;
  96.     // A dif e q ali se usa 1 ponteiro apenas
  97.     for (i = 0; i < totpri; i++) {        // for(i = 0; i < totpri - 1; i++)
  98.         ant = p;                                      //      p->prox = prox;
  99.         p = p->prox;                                  // lst = p->prox;
  100.                                           // p->prox = NULL;
  101.     }
  102.  
  103.     ant->prox = NULL;// return çst;
  104.  
  105.     return p;
  106. }
  107.  
  108. No* fazCopiaRecursiva(No* lst) {
  109.     if (lst == NULL)
  110.         return NULL;
  111.  
  112.     No* novo;    
  113.  
  114.     novo = (No*)malloc(sizeof(No));
  115.     if (novo == NULL)exit(1);
  116.  
  117.     novo->info = (Informacao*)malloc(sizeof(Informacao));
  118.     if (novo->info == NULL)exit(1);
  119.  
  120.     // copia das infos dentro do no->info
  121.     strcpy(novo->info->nome, lst->info->nome);
  122.     novo->info->codigo = lst->info->codigo;
  123.  
  124.     // copia infos dentro do No
  125.     strcpy(novo->nome, lst->nome);
  126.     novo->sexo = lst->sexo;
  127.     novo->prox = fazCopiaRecursiva(lst->prox);
  128.  
  129.     return novo;
  130. }
  131.  
  132. int maiorMatriculaRecursiva(Pedido* fristAdress) {
  133.     if (fristAdress == NULL)return NULL;
  134.     int maior_do_resto = maiorMatriculaRecursiva(fristAdress->prox);
  135.     if (fristAdress->matricula > maior_do_resto)
  136.         return fristAdress->matricula;
  137.  
  138.     return maior_do_resto;
  139. }
  140.  
  141. int maiorMatricula(Pedido* lst) {
  142.     int biggest=0;
  143.     Pedido* p;
  144.     for (p = lst; p != NULL; p=p->prox) {
  145.         if (biggest < p->matricula) {
  146.             biggest = p->matricula;
  147.         }
  148.     }
  149.  
  150.     return biggest;
  151. }
  152.  
  153. void insereNaPosicao(No* lst, int pos, int mat, char* nome) {
  154.     No* p = lst, * t;
  155.     for (int i = 0; i < pos; i++) {
  156.         p = p->prox;
  157.     }
  158. }
  159.  
  160. void listaLibera(No* lst) { // sera inserido o "no" no parametro
  161.     No* p = lst, * t; // declara 2 vars que sao do tipo p com p recebendo a list como argumento
  162.     while (p != NULL) { // enquanto nao chega no final da lista vai continuar
  163.         t = p->prox; // guarda endereco
  164.         free(p->info); // libera
  165.         free(p); // libera
  166.         p = t; // passa valor
  167.     }
  168. }
  169.  
  170. void listaLiberaPedidos(Pedido* lst) {
  171.     Pedido* p = lst, * t; // declara 2 vars que sao do tipo p com p recebendo a list como argumento
  172.     while (p != NULL) { // enquanto nao chega no final da lista vai continuar
  173.         t = p->prox; // guarda endereco
  174.         free(p); // libera
  175.         p = t; // passa valor
  176.     }
  177. }
  178.  
  179. int main(void) {
  180.     No* lst, * meio;
  181.  
  182.     Informacao v[] = { {22, "A30"} , {36, "A20"} , {45,"A50"}, {31, "BIO"}, {84,"A60"} };
  183.  
  184.     int i;
  185.  
  186.     lst = lst_cria();
  187.     for (i = 0; i < 5; i++) {
  188.         lst = lst_insere(lst, v[i].codigo, v[i].nome);
  189.         if (lst == NULL) {
  190.             exit(1);
  191.         }
  192.     }
  193.  
  194.     printf("Exibe lista !\n");
  195.     lista_exibe(lst);
  196.  
  197.     printf("\n Lista meio !\n");
  198.     meio = quebraAoMeio(lst);
  199.     lista_exibe(meio);
  200.  
  201.     printf("\n Exibe lista !\n");
  202.     lista_exibe(lst);
  203.  
  204.  
  205.     listaLibera(meio);
  206.     listaLibera(lst);
  207.     printf(" Meio e lst liberadas.\n");
  208.  
  209.  
  210.  
  211.     /*  Agora a parte do exerc 3*/
  212.     Pedido vPedidos[] = { {203, "ic"}, {205, "ic"}, {101, "soc"} , {415, "dout"}, {201, "ic"} };
  213.     Pedido* lstPedidos = lst_cria_pedido();
  214.     for (i = 0; i < 5; i++) {
  215.         lstPedidos = lst_insere_pedido(lstPedidos, vPedidos[i].matricula, vPedidos[i].tipoDoPedido);
  216.         if (lstPedidos == NULL) {
  217.             exit(1);
  218.         }
  219.     }
  220.  
  221.     lista_exibe_produto(lstPedidos);
  222.     int biggestValue = maiorMatriculaRecursiva(lstPedidos);
  223.     printf("\nMAIOR VALOR via recursiva-> %d \n", biggestValue);
  224.     printf("\nMAIOR VALOR -> % d\n", maiorMatricula(lstPedidos));
  225.  
  226.     // parte de teste da recurisva
  227.     No* listaCopiada, * listaCriada;
  228.  
  229.     listaCriada = lst_cria();
  230.     listaCriada = lst_insere(listaCriada, 1, "aA");
  231.     listaCriada = lst_insere(listaCriada, 2, "Bang");
  232.     listaCriada = lst_insere(listaCriada, 3, "Cactus");
  233.  
  234.     listaCopiada = lst_cria();
  235.     listaCopiada = fazCopiaRecursiva(listaCriada);
  236.     printf("\nLista copiada:\n");
  237.     printf("%s\n", listaCriada->info->nome);
  238.     printf("%s\n", listaCopiada->info->nome);
  239.  
  240.  
  241.     lista_exibe(listaCriada);
  242.  
  243.     // aqui vamos inserir na posição
  244.    
  245.  
  246.  
  247.     lista_exibe(listaCopiada);
  248.  
  249.  
  250.  
  251.     listaLibera(listaCriada);
  252.     printf("Lista criada liberada.\n");
  253.  
  254.     listaLibera(listaCopiada);
  255.     printf("Lista copiada liberada.\n");
  256.  
  257.     listaLiberaPedidos(lstPedidos);
  258.     printf("Lista pedidos liberada.\n");
  259.  
  260.     return 0;
  261. }
Add Comment
Please, Sign In to add comment