Advertisement
Guest User

Lista SelectionSort

a guest
Nov 21st, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct lista Lista;
  6.  
  7. Lista * lista_cria ();
  8. Lista * lista_copia (Lista * p);
  9. void lista_libera (Lista * p);
  10. int lista_insere_inicio (Lista * p, char * elemento);
  11. int lista_insere_final (Lista * p, char * elemento);
  12. int lista_insere_posicao (Lista * p, char * elemento, int posicao);
  13. int lista_remove_inicio (Lista * p);
  14. int lista_remove_final  (Lista * p);
  15. int lista_remove_posicao (Lista * p, int posicao);
  16. char * lista_obtem_elemento  (Lista * p, int posicao); /* retorna elemento em uma posicao */
  17. int lista_se_presente  (Lista * p, char * elemento); /* retorna posicao do elemento, ou zero se ausente */
  18. int lista_obtem_tamanho  (Lista * p);
  19. char * lista_imprime  (Lista * p);
  20. void lista_ordena (Lista * p);
  21. int lista_se_consistente (Lista * p);
  22.  
  23. char * private_char_copia (char * s) {
  24.     char * aux = (char *) malloc (strlen(s)+1);
  25.     strcpy(aux, s);
  26.     return aux;
  27. }
  28. /* IMPLEMENTACAO POR ENCADEAMENTO DUPLO */
  29. typedef struct no No;
  30. struct no {
  31.     struct no * anterior;
  32.     char * elemento;
  33.     struct no * proximo;
  34. };
  35. struct lista {
  36.     No * cabeca;
  37.     int tamanho;
  38. };
  39. Lista * lista_cria () {
  40.     Lista * q = (Lista *) malloc(sizeof(Lista));
  41.     if (q!=NULL) {
  42.         q->cabeca = NULL;
  43.         q->tamanho = 0;
  44.     }
  45.     return q;
  46. }
  47. Lista * lista_copia (Lista * p) {
  48.     return NULL;
  49. }
  50. void lista_libera (Lista * p) {
  51.     No * q = p->cabeca;
  52.     int tamanho;
  53.     for (tamanho = lista_obtem_tamanho(p); tamanho > 0; tamanho--) {
  54.         No * aux = q->proximo;
  55.         free(q);
  56.         q = aux;
  57.     }
  58.     free(p);
  59. }
  60. int lista_insere_inicio (Lista * p, char * elemento) {
  61.     No * no = (No *) malloc(sizeof(No));
  62.     if (no==NULL)
  63.         return 0; // insercao sem sucesso;
  64.     no->elemento = (char *) malloc(strlen(elemento)+1);
  65.     strcpy(no->elemento, elemento);
  66.     if (!lista_obtem_tamanho(p)) {
  67.         no->anterior = no;
  68.         no->proximo  = no;
  69.     } else {
  70.         p->cabeca->anterior->proximo = no;
  71.         no->anterior = p->cabeca->anterior;
  72.         no->proximo  = p->cabeca;
  73.         p->cabeca->anterior = no;
  74.     }
  75.     p->cabeca = no;
  76.     p->tamanho = p->tamanho + 1;
  77.     return 1; // insercao com sucesso
  78. }
  79. int lista_insere_final (Lista * p, char * elemento) {
  80.     return 0; // insercao sem sucesso
  81. }
  82. int lista_insere_posicao (Lista * p, char * elemento, int posicao) {
  83.     return 0; // insercao sem sucesso
  84. }
  85. int lista_remove_inicio (Lista * p) {
  86.     return 0; // remocao sem sucesso
  87. }
  88. int lista_remove_final  (Lista * p) {
  89.     return 0; // remocao sem sucesso
  90. }
  91. int lista_remove_posicao (Lista * p, int posicao) {
  92.     return 0; // remocao sem sucesso
  93. }
  94. char * lista_obtem_elemento  (Lista * p, int posicao) {
  95.     if ((posicao<1)||(posicao>lista_obtem_tamanho(p)))
  96.         return NULL;
  97.     No * q = p->cabeca;
  98.     int i;
  99.     for (i=0; i<posicao-1; i++)
  100.         q = q->proximo;
  101.     return private_char_copia(q->elemento);
  102. }
  103. int lista_se_presente  (Lista * p, char * elemento) {
  104.     return 0; // elemento ausente
  105. }
  106. int lista_obtem_tamanho  (Lista * p) {
  107.     return p->tamanho;
  108. }
  109. char * lista_imprime  (Lista * p) {
  110.     char * retorno = (char *) malloc(lista_obtem_tamanho(p)*10+1);
  111.     retorno[0] = '\0';
  112.     No * q = p->cabeca;
  113.     int i;
  114.     for (i=0; i < lista_obtem_tamanho(p); i++) {
  115.         char aux[50];
  116.         sprintf(aux, "%s " , q->elemento);
  117.         strcat(retorno, aux);
  118.         q = q->proximo;
  119.     }
  120.     retorno = (char*) realloc (retorno, strlen(retorno)+1);
  121.     return retorno;
  122. }
  123. void lista_ordena (Lista * p) {
  124.     No *foco, *iterador, *menor; //foco -> posicao a trocar de valor | iterador -> ponteiro de comparacao | menor -> ponteiro do No com menor elemento ate o momento
  125.     char *aux;
  126.     if (p == NULL || lista_obtem_tamanho(p) < 1)
  127.         return;
  128.  
  129.     foco = p->cabeca;
  130.     while (foco->proximo != p->cabeca){ //Enquanto nao chega no fim da lista
  131.         menor = foco;
  132.         iterador = foco->proximo;
  133.         while(iterador != p->cabeca){
  134.             if (strcmp(menor->elemento, iterador->elemento) > 0){
  135.                 menor = iterador;
  136.             }
  137.             iterador = iterador->proximo;  
  138.         }
  139.         //Troca dos elementos dos No
  140.         aux = menor->elemento;
  141.         menor->elemento = foco->elemento;
  142.         foco->elemento = aux;
  143.        
  144.         //Proximo No a trocar de valor
  145.         foco = foco->proximo;
  146.     }
  147.     return;
  148. }
  149. int lista_se_consistente (Lista * p) {
  150.     if ( ! lista_obtem_tamanho(p) )
  151.         return 1; // lista consistente
  152.     No * aux = p->cabeca;
  153.     int tam;
  154.     for (tam = lista_obtem_tamanho(p); tam > 0; tam--)
  155.         aux = aux->proximo;
  156.     if (aux != p->cabeca)
  157.         return 0; // lista nao consistente
  158.     for (tam = lista_obtem_tamanho(p); tam > 0; tam--)
  159.         aux = aux->anterior;
  160.     if (aux != p->cabeca)
  161.         return 0; // lista nao consistente
  162.     return 1; // lista consistente
  163. }
  164.  
  165. int main () {
  166.     int n;
  167.     char aux[30];
  168.     Lista * p = lista_cria ();
  169.     scanf ("%s", aux);
  170.     while (strcmp(aux,"fim")) {
  171.         lista_insere_inicio (p, aux);
  172.         scanf ("%s", aux);
  173.     }
  174.     printf("[tamanho=%d] %s\n\n", lista_obtem_tamanho(p), lista_imprime(p));
  175.     lista_ordena(p);
  176.     printf("[tamanho=%d] %s\n", lista_obtem_tamanho(p), lista_imprime(p));
  177.     printf("Lista consistente? Resposta: %s\n", lista_se_consistente(p)?"sim":"nao");
  178.     lista_libera(p);
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement