Advertisement
sconetto

Lista Duplamente Encadeada

Mar 30th, 2016
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <time.h>
  7. #define MAX_STRING 140
  8.  
  9. struct lista {
  10.     int info;
  11.     char nome[MAX_STRING];
  12.     struct lista* prox;
  13.     struct lista* ant;
  14. };
  15.  
  16. typedef struct lista lista;
  17.  
  18. lista* cria_lista() {
  19.     return NULL;
  20. }
  21.  
  22. int vazia(lista* lst) {
  23.     return (lst == NULL);
  24. }
  25.  
  26. lista* insere(lista* lst, int aux_info, char aux_nome[MAX_STRING]) {
  27.     lista* novo = (lista*) malloc(sizeof(lista));
  28.     lista* aux = lst;
  29.     lista* scnd_aux = lst;
  30.     int i = 0, j = 0;
  31.     novo->prox = NULL;
  32.     novo->info = aux_info;
  33.     strcpy(novo->nome, aux_nome);
  34.     if (lst == NULL) {
  35.         novo->ant = NULL;
  36.         lst = novo;
  37.     }
  38.     else {
  39.         while (aux != NULL) {
  40.             if (aux->info <= aux_info) {
  41.                 scnd_aux = aux;
  42.                 j++;
  43.             }
  44.             //printf("%d\n", aux->info);
  45.             aux = aux->prox;
  46.             i++;
  47.         }
  48.         if (j == 0) {
  49.             novo->ant = NULL;
  50.             lst->ant = novo;
  51.             novo->prox = lst;
  52.             lst = novo;
  53.         }
  54.         else if (i == j) {
  55.             scnd_aux->prox = novo;
  56.             novo->ant = scnd_aux;
  57.         }
  58.         else if (j < i) {
  59.             scnd_aux->prox->ant = novo;
  60.             novo->prox = scnd_aux->prox;
  61.             novo->ant = scnd_aux;
  62.             scnd_aux->prox = novo;
  63.         }
  64.     }
  65.  
  66.     return lst;
  67. }
  68.  
  69. void imprime_crescente(lista* lst) {
  70.     if (!vazia(lst)) {
  71.         lista* aux;
  72.         for (aux = lst; aux != NULL; aux = aux->prox) {
  73.             printf("info: %d\n", aux->info);
  74.             printf("nome: %s\n", aux->nome);
  75.         }
  76.     }
  77.     else {
  78.         printf("Lista não encontrada ou vazia!\n");
  79.         exit(1);
  80.     }
  81. }
  82.  
  83. void imprime_decrescente(lista* lst) {
  84.     if (!vazia(lst)) {
  85.         lista* aux = lst;
  86.         while (aux->prox != NULL)
  87.             aux = aux->prox;
  88.         for (aux; aux != NULL; aux = aux->ant) {
  89.             printf("info: %d\n", aux->info);
  90.             printf("nome: %s\n", aux->nome);
  91.         }
  92.  
  93.     }
  94.     else {
  95.         printf("Lista não encontrada ou vazia!\n");
  96.         exit(1);
  97.     }
  98. }
  99.  
  100. int leia_valor() {
  101.     int valor;
  102.     printf("Insira o valor: ");
  103.     scanf("%d", &valor);
  104.     return valor;
  105. }
  106.  
  107. void leia_string(char s[]) {
  108.     int i = 0, c;
  109.     printf("Insira o nome: ");
  110.     c = getchar();
  111.     while (c != '\n') {
  112.         s[i] = c;
  113.         i = i + 1;
  114.         c = getchar();
  115.     }
  116.     s[i] = '\n';
  117.     s[i + 1] = '\0';
  118. }
  119.  
  120. void interface() {
  121.     printf("-------------------------------------------------\n");
  122.     printf("\t\tMENU\n");
  123.     printf("-------------------------------------------------\n");
  124.     printf(" 1 - Inserir dados (ordenados)\n");
  125.     printf(" 2 - Imprimir ordem crescente\n");
  126.     printf(" 3 - Imprimir ordem decrescente\n");
  127.     printf(" 4 - Sair\n");
  128.     printf("-------------------------------------------------\n");
  129. }
  130.  
  131. void fflush_in() {
  132.     int ch;
  133.     do {
  134.         ch = fgetc(stdin);
  135.     } while (ch != EOF && ch != '\n');
  136. }
  137.  
  138. int main(int argc, char const *argv[]) {
  139.     int opcao;
  140.  
  141.     interface();
  142.     lista* lst;
  143.     int aux_info;
  144.     char aux_nome[MAX_STRING];
  145.     lst = cria_lista();
  146.     while (1) {
  147.         printf("Digite a opção: ");
  148.         scanf("%d", &opcao);
  149.         switch (opcao) {
  150.         case 1:
  151.             fflush_in();
  152.             leia_string(aux_nome);
  153.             aux_info = leia_valor();
  154.             lst = insere(lst, aux_info, aux_nome);
  155.             printf("Inserido!\n");
  156.             sleep(2);
  157.             break;
  158.  
  159.         case 2:
  160.             imprime_crescente(lst);
  161.             sleep(4);
  162.             break;
  163.  
  164.         case 3:
  165.             imprime_decrescente(lst);
  166.             sleep(4);
  167.             break;
  168.  
  169.         case 4:
  170.             exit(1);
  171.  
  172.         default:
  173.             printf("Opção não válida!\n");
  174.         }
  175.         system("clear");
  176.         interface();
  177.     }
  178.     return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement