Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- // declarar aqui porque dai n tem problema
- typedef struct informacao Informacao;
- typedef struct no No;
- typedef struct pedido Pedido;
- struct informacao {
- int codigo;
- char nome[51];
- };
- struct no {
- Informacao* info;
- char nome[20]; /* nome da pessoa */
- char sexo; /* ‘H’ (homem) ou ‘M’ (mulher) */
- No* prox;
- };
- struct pedido {
- int matricula;
- char tipoDoPedido[21]; /* “soc”, “ic”, “mest”, “dout” */
- Pedido* prox;
- };
- No* lst_cria(void) {
- No* no;
- no = NULL;
- return no;
- }
- Pedido* lst_cria_pedido(void) {
- Pedido* no;
- no = NULL;
- return no;
- }
- No* lst_insere(No* no, int cod, char* nome) {
- No* novoNo = (No*)malloc(sizeof(No)); // aloca o ponteiro
- if (novoNo == NULL) return 0; // verifica se alocou certo
- novoNo->info = (Informacao*)malloc(sizeof(Informacao));
- if (novoNo->info == NULL) exit(1); // verifica se alocou certo
- novoNo->info->codigo = cod; // Insere parametro cod.
- strcpy(novoNo->info->nome, nome); // Insere parametro nome
- novoNo->prox = no; // aponta para o proximo da lista
- return novoNo; // retorna o novo ponteiro agora com os valores insertos
- }
- Pedido* lst_insere_pedido(Pedido* lista, int cod, char* tipoPedido) { //
- Pedido* novoNo = (Pedido*)malloc(sizeof(Pedido)); // aloca o ponteiro
- if (novoNo == NULL) return 0; // verifica se alocou certo
- novoNo->matricula = cod; // Insere parametro cod.
- strcpy(novoNo->tipoDoPedido, tipoPedido); // Insere parametro nome
- novoNo->prox = lista; // aponta para o proximo da lista
- return novoNo; // retorna o novo ponteiro agora com os valores insertos
- }
- void lista_exibe(No* lst) {
- No* p;
- for (p = lst; p != NULL; p = p->prox) {
- printf("Cod: %d Nome: %s\n", p->info->codigo, p->info->nome);
- }
- }
- void lista_exibe_produto(Pedido* lst) {
- Pedido* p;
- for (p = lst; p != NULL; p = p->prox) {
- printf("matricula: %d tipoDoPedido: %s\n", p->matricula, p->tipoDoPedido);
- }
- }
- No* quebraAoMeio(No* lst) {
- No* p, * ant = NULL;
- int i, totpri = 0, tot;
- tot = 0;
- for (p = lst; p != NULL; p = p->prox) {
- tot++;
- totpri = tot / 2;
- }
- if (tot < 2) return NULL;
- if (tot % 2 != 2)
- totpri++;
- p = lst;
- // A dif e q ali se usa 1 ponteiro apenas
- for (i = 0; i < totpri; i++) { // for(i = 0; i < totpri - 1; i++)
- ant = p; // p->prox = prox;
- p = p->prox; // lst = p->prox;
- // p->prox = NULL;
- }
- ant->prox = NULL;// return çst;
- return p;
- }
- No* fazCopiaRecursiva(No* lst) {
- if (lst == NULL)
- return NULL;
- No* novo;
- novo = (No*)malloc(sizeof(No));
- if (novo == NULL)exit(1);
- novo->info = (Informacao*)malloc(sizeof(Informacao));
- if (novo->info == NULL)exit(1);
- // copia das infos dentro do no->info
- strcpy(novo->info->nome, lst->info->nome);
- novo->info->codigo = lst->info->codigo;
- // copia infos dentro do No
- strcpy(novo->nome, lst->nome);
- novo->sexo = lst->sexo;
- novo->prox = fazCopiaRecursiva(lst->prox);
- return novo;
- }
- int maiorMatriculaRecursiva(Pedido* fristAdress) {
- if (fristAdress == NULL)return NULL;
- int maior_do_resto = maiorMatriculaRecursiva(fristAdress->prox);
- if (fristAdress->matricula > maior_do_resto)
- return fristAdress->matricula;
- return maior_do_resto;
- }
- int maiorMatricula(Pedido* lst) {
- int biggest=0;
- Pedido* p;
- for (p = lst; p != NULL; p=p->prox) {
- if (biggest < p->matricula) {
- biggest = p->matricula;
- }
- }
- return biggest;
- }
- void insereNaPosicao(No* lst, int pos, int mat, char* nome) {
- No* p = lst, * t;
- for (int i = 0; i < pos; i++) {
- p = p->prox;
- }
- }
- void listaLibera(No* lst) { // sera inserido o "no" no parametro
- No* p = lst, * t; // declara 2 vars que sao do tipo p com p recebendo a list como argumento
- while (p != NULL) { // enquanto nao chega no final da lista vai continuar
- t = p->prox; // guarda endereco
- free(p->info); // libera
- free(p); // libera
- p = t; // passa valor
- }
- }
- void listaLiberaPedidos(Pedido* lst) {
- Pedido* p = lst, * t; // declara 2 vars que sao do tipo p com p recebendo a list como argumento
- while (p != NULL) { // enquanto nao chega no final da lista vai continuar
- t = p->prox; // guarda endereco
- free(p); // libera
- p = t; // passa valor
- }
- }
- int main(void) {
- No* lst, * meio;
- Informacao v[] = { {22, "A30"} , {36, "A20"} , {45,"A50"}, {31, "BIO"}, {84,"A60"} };
- int i;
- lst = lst_cria();
- for (i = 0; i < 5; i++) {
- lst = lst_insere(lst, v[i].codigo, v[i].nome);
- if (lst == NULL) {
- exit(1);
- }
- }
- printf("Exibe lista !\n");
- lista_exibe(lst);
- printf("\n Lista meio !\n");
- meio = quebraAoMeio(lst);
- lista_exibe(meio);
- printf("\n Exibe lista !\n");
- lista_exibe(lst);
- listaLibera(meio);
- listaLibera(lst);
- printf(" Meio e lst liberadas.\n");
- /* Agora a parte do exerc 3*/
- Pedido vPedidos[] = { {203, "ic"}, {205, "ic"}, {101, "soc"} , {415, "dout"}, {201, "ic"} };
- Pedido* lstPedidos = lst_cria_pedido();
- for (i = 0; i < 5; i++) {
- lstPedidos = lst_insere_pedido(lstPedidos, vPedidos[i].matricula, vPedidos[i].tipoDoPedido);
- if (lstPedidos == NULL) {
- exit(1);
- }
- }
- lista_exibe_produto(lstPedidos);
- int biggestValue = maiorMatriculaRecursiva(lstPedidos);
- printf("\nMAIOR VALOR via recursiva-> %d \n", biggestValue);
- printf("\nMAIOR VALOR -> % d\n", maiorMatricula(lstPedidos));
- // parte de teste da recurisva
- No* listaCopiada, * listaCriada;
- listaCriada = lst_cria();
- listaCriada = lst_insere(listaCriada, 1, "aA");
- listaCriada = lst_insere(listaCriada, 2, "Bang");
- listaCriada = lst_insere(listaCriada, 3, "Cactus");
- listaCopiada = lst_cria();
- listaCopiada = fazCopiaRecursiva(listaCriada);
- printf("\nLista copiada:\n");
- printf("%s\n", listaCriada->info->nome);
- printf("%s\n", listaCopiada->info->nome);
- lista_exibe(listaCriada);
- // aqui vamos inserir na posição
- lista_exibe(listaCopiada);
- listaLibera(listaCriada);
- printf("Lista criada liberada.\n");
- listaLibera(listaCopiada);
- printf("Lista copiada liberada.\n");
- listaLiberaPedidos(lstPedidos);
- printf("Lista pedidos liberada.\n");
- return 0;
- }
Add Comment
Please, Sign In to add comment