StreetGT

UFP - Estruturas Dinamicas

Jan 6th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.94 KB | None | 0 0
  1. /**
  2. Exemplo de 3 estruturas ligadas entre si
  3. Tiago Cardoso - [email protected]
  4. Como sou lazzy, não fiz os free da memoria, Enjoy.
  5. **/
  6.  
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. typedef struct livro {
  12.     char titulo[120];
  13.     char autor[120];
  14.     int paginas;
  15.     struct livro* pnext;
  16. } LIVRO;
  17.  
  18. typedef struct prateleira {
  19.     char abecedario[20];
  20.     struct prateleira* pnext;
  21.     LIVRO* firstbook;
  22. } PRATELEIRA;
  23.  
  24. typedef struct estante {
  25.     char tipo[20];
  26.     PRATELEIRA* prateleirafirst;
  27. } ESTANTE;
  28.  
  29. void print_prateleiras(ESTANTE* es);
  30. PRATELEIRA* enserir_prateleira(ESTANTE* es, char nome[25]);
  31. void print_livros(PRATELEIRA* pt);
  32.  
  33. int main()
  34. {
  35.     ESTANTE es = {"Informatica",NULL};
  36.     // Criar 2 apontadores para as estantes
  37.     PRATELEIRA* primeira = enserir_prateleira(&es,"De A a B");
  38.     PRATELEIRA* segunda = enserir_prateleira(&es,"De C a D");
  39.     print_prateleiras(&es);
  40.     // Enserir na 1 estante
  41.     inserir_livro(primeira,"AA1", "Tiago",10);
  42.     inserir_livro(primeira,"AA12", "Tiago2",10);
  43.     print_livros(primeira);
  44.     // Enserir na 2 estante
  45.     inserir_livro(segunda,"CC1", "Tiago",10);
  46.     inserir_livro(segunda,"CC12", "Tiago2",10);
  47.     print_livros(segunda);
  48.  
  49.     // Extras
  50.     find_livro_estante(&es, "CC12");
  51.     find_livro_prateleira(primeira, "AA1");
  52.     guardar_estante_ficheiro(&es,"obrigadotiago.txt");
  53.     return 0;
  54. }
  55.  
  56.  
  57. PRATELEIRA* enserir_prateleira(ESTANTE* es, char nome[25]) // retorna o endereço de memoria da prateleira acabada de ser inserida
  58. {
  59.     PRATELEIRA* aux;
  60.     PRATELEIRA* p = NULL;
  61.  
  62.     // Cria uma prateleira nova
  63.     p = (PRATELEIRA*)malloc(sizeof(PRATELEIRA));
  64.     strcpy(p->abecedario,nome);
  65.     p->firstbook = NULL;
  66.     LIVRO* test = p->firstbook;
  67.     p->pnext = NULL;
  68.  
  69.     // Se nao existir a primeira, vai ser a primeira então.
  70.     if(es->prateleirafirst == NULL)
  71.     {
  72.         es->prateleirafirst = p;
  73.         return p;
  74.     }
  75.  
  76.     // Aponta para a primeira e começa até encontrar a ultima
  77.     aux = es->prateleirafirst;
  78.     while(aux->pnext != NULL)
  79.     {
  80.         aux = aux->pnext;
  81.     }
  82.  
  83.     aux->pnext = p;
  84.     return p;
  85. }
  86.  
  87. void inserir_livro(PRATELEIRA* pt, char titulo[], char autor[], int paginas)
  88. {
  89.     LIVRO* aux;
  90.     LIVRO* novolivro = NULL;
  91.  
  92.     // Cria um livro novo
  93.     novolivro = (LIVRO*)malloc(sizeof(LIVRO));
  94.     strcpy(novolivro->titulo,titulo);
  95.     strcpy(novolivro->autor,autor);
  96.     novolivro->paginas = paginas;
  97.     novolivro->pnext = NULL;
  98.  
  99.     // Se nao existir a primeira, vai ser a primeira então.
  100.     if(pt->firstbook == NULL)
  101.     {
  102.         pt->firstbook = novolivro;
  103.         return;
  104.     }
  105.  
  106.     // Aponta para a primeiro livro ate encontrar o ultimo
  107.     aux = pt->firstbook;
  108.     while(aux->pnext != NULL)
  109.     {
  110.         aux = aux->pnext;
  111.     }
  112.  
  113.     aux->pnext = novolivro;
  114. }
  115.  
  116. void print_prateleiras(ESTANTE* es)
  117. {
  118.     PRATELEIRA* aux = NULL;
  119.     aux = es->prateleirafirst;
  120.     if(es->prateleirafirst != NULL) // Existe 1 prateleira
  121.     {
  122.         aux = es->prateleirafirst;
  123.         while(aux != NULL)
  124.         {
  125.             printf("Nova Prateleira | Abecedario: %s\n",aux->abecedario);
  126.             aux = aux->pnext;
  127.         }
  128.     }
  129.     else
  130.     {
  131.         printf("Não ha prateleiras!");
  132.         exit(1);
  133.     }
  134. }
  135.  
  136.  
  137. void print_livros(PRATELEIRA* pt)
  138. {
  139.     LIVRO* aux = NULL;
  140.     aux = pt->firstbook;
  141.     if(pt->firstbook != NULL) // Existe livro na prateleira
  142.     {
  143.         printf("Livros da Prateleira: %s\n",pt->abecedario);
  144.         aux = pt->firstbook;
  145.         while(aux != NULL)
  146.         {
  147.             printf("Nome %s\n",aux->titulo);
  148.             aux = aux->pnext;
  149.         }
  150.     }
  151.     else
  152.     {
  153.         printf("Não ha livros nessa prateleira!\s");
  154.         exit(1);
  155.     }
  156. }
  157.  
  158.  
  159. void find_livro_prateleira(PRATELEIRA* pt, char nomelivro[])
  160. {
  161.     int flag = 0;
  162.     LIVRO* aux = NULL;
  163.     aux = pt->firstbook;
  164.     if(pt->firstbook != NULL) // Existe livro na prateleira
  165.     {
  166.         aux = pt->firstbook;
  167.         while(aux != NULL)
  168.         {
  169.             if(strcmp(aux->titulo,nomelivro) == 0)
  170.             {
  171.                 printf("Encontrado! Nome %s\n",aux->titulo);
  172.                 flag = 1;
  173.                 break;
  174.             }
  175.             aux = aux->pnext;
  176.         }
  177.     }
  178.     else
  179.     {
  180.         printf("Não ha livros nessa prateleira!\s");
  181.         exit(1);
  182.     }
  183.     if(flag == 0)
  184.     {
  185.         printf("Nao foi encontrado o livro \"%s\" na prateleira \"%s\"",nomelivro,pt->abecedario);
  186.     }
  187. }
  188.  
  189.  
  190. void find_livro_estante(ESTANTE* es, char nomelivro[])
  191. {
  192.     int flag = 0;
  193.     PRATELEIRA* ptaux = NULL;
  194.     ptaux = es->prateleirafirst;
  195.     if(es->prateleirafirst != NULL) // Existe 1 prateleira
  196.     {
  197.         ptaux = es->prateleirafirst;
  198.         while(ptaux != NULL)
  199.         {
  200.             if(ptaux->firstbook == NULL) break; // Se não existir o 1º livro na prateleira
  201.  
  202.             LIVRO* livroaux = ptaux->firstbook; // Para auxiliar, code mess
  203.             while(livroaux != NULL)
  204.             {
  205.                 if(strcmp(livroaux->titulo,nomelivro) == 0)
  206.                 {
  207.                     printf("Foi encontrado o (Livro - Nome %s) na (Prateleira - Nome: %s) \n",livroaux->titulo,ptaux->abecedario);
  208.                     flag = 1;
  209.                     break;
  210.                 }
  211.                 livroaux = livroaux->pnext; // Proximo livro
  212.  
  213.             }
  214.             ptaux = ptaux->pnext; // Proxima prateleira
  215.         }
  216.     }
  217.     else
  218.     {
  219.         printf("Não ha prateleiras!");
  220.         exit(1);
  221.     }
  222.     if(flag == 0)
  223.     {
  224.         printf("Nao foi encontrado o livro em nenhuma das estantes!\n");
  225.     }
  226. }
  227.  
  228.  
  229. void guardar_estante_ficheiro(ESTANTE* es, char nomeficheiro[])
  230. {
  231.     char c[1000]; // OHHH BOY; WE GONNA FLOOD THIS SHIT
  232.     FILE *fptr;
  233.  
  234.     fptr=fopen(nomeficheiro,"w");
  235.     if(fptr==NULL){
  236.         printf("Nao deu para guardar o ficheiro, vai o bar buscar uma mini enquanto isso!");
  237.         exit(1);
  238.     }
  239.  
  240.     // LET THE LITTLE FLOOD BEGIN!
  241.     PRATELEIRA* ptaux = NULL;
  242.     ptaux = es->prateleirafirst;
  243.     if(es->prateleirafirst != NULL) // Existe 1 prateleira
  244.     {
  245.         ptaux = es->prateleirafirst;
  246.         while(ptaux != NULL)
  247.         {
  248.             if(ptaux->firstbook == NULL) break; // Se não existir o 1º livro na prateleira
  249.  
  250.             LIVRO* livroaux = ptaux->firstbook; // Para auxiliar, code mess
  251.             while(livroaux != NULL)
  252.             {
  253.                 fprintf(fptr,"%s",livroaux->titulo);
  254.                 fprintf(fptr,"|%s",livroaux->autor);
  255.                 fprintf(fptr,"|%d",livroaux->paginas);
  256.                 livroaux = livroaux->pnext; // Proximo livro
  257.  
  258.             }
  259.             ptaux = ptaux->pnext; // Proxima prateleira
  260.             if(ptaux != NULL) // Fiz esta verificaao para nao criar uma nova linha se nao existir mais prateleiras
  261.             {
  262.                 fprintf(fptr,"\n");
  263.             }
  264.         }
  265.     }
  266.     else
  267.     {
  268.         printf("Não ha prateleiras na estante!");
  269.         exit(1);
  270.     }
  271.  
  272.     fclose(fptr);
  273. }
Advertisement
Add Comment
Please, Sign In to add comment