Exemplo ordenao de uma lista pelo Selection Sort

  • Slides: 36
Download presentation
Exemplo: ordenação de uma lista pelo Selection. Sort: #include <stdio. h> #include <stdlib. h>

Exemplo: ordenação de uma lista pelo Selection. Sort: #include <stdio. h> #include <stdlib. h> typedef struct noh; typedef noh *lista; typedef noh *posicao; struct noh { int elem; noh *prox; }; lista Nova. Lista (void); void Escrever. Lista (lista); void Ordenar. Lista (lista);

int main () { lista L; printf ("Leitura de uma lista: nn"); L =

int main () { lista L; printf ("Leitura de uma lista: nn"); L = Nova. Lista (); printf ("n. Lista inicial: "); Escrever. Lista (L); Ordenar. Lista (L); printf ("n. Lista ordenada: "); Escrever. Lista (L); printf("nn"); system ("pause"); return 0; }

L ## main 45 52 19 17 73 int main () { lista L;

L ## main 45 52 19 17 73 int main () { lista L; printf ("Leitura de uma lista: nn"); L = Nova. Lista (); printf ("n. Lista inicial: "); Escrever. Lista (L); Ordenar. Lista (L); printf ("n. Lista ordenada: "); Escrever. Lista (L); printf("nn"); system ("pause"); return 0; } 34

L main: Ordenar. Lista (L); ## 45 52 p L 19 q void Ordenar.

L main: Ordenar. Lista (L); ## 45 52 p L 19 q void Ordenar. Lista (lista L) { posicao p, q, min; int menor; 17 min 73 34 menor Ordenar. Lista - - - } Idéia do Método Selection-Sort

L main: Ordenar. Lista (L); ## 45 p 52 min 19 q 17 q

L main: Ordenar. Lista (L); ## 45 p 52 min 19 q 17 q min q q L 73 min void Ordenar. Lista (lista L) { posicao p, q, min; int menor; 34 q menor 17 45 19 Ordenar. Lista q->elem < menor é verdade falso - - - } Atualizar Avançar q menor e min e Avançar q Encontrado o menor elemento do 1º Percurso: 17 q

L main: Ordenar. Lista (L); ## 45 52 19 p 45 73 34 q

L main: Ordenar. Lista (L); ## 45 52 19 p 45 73 34 q min L menor 17 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 1º Percurso: 17

L main: Ordenar. Lista (L); ## 17 52 19 p 45 73 34 q

L main: Ordenar. Lista (L); ## 17 52 19 p 45 73 34 q min L menor 17 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 1º Percurso: 17

L main: Ordenar. Lista (L); ## 17 p 52 19 p L 45 73

L main: Ordenar. Lista (L); ## 17 p 52 19 p L 45 73 34 q min menor 17 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Iniciar novo percurso

L main: Ordenar. Lista (L); ## 17 52 p 19 45 73 min q

L main: Ordenar. Lista (L); ## 17 52 p 19 45 73 min q L 34 q menor 19 17 52 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 2º Percurso: 19 q

L main: Ordenar. Lista (L); ## 17 52 52 p L 45 73 34

L main: Ordenar. Lista (L); ## 17 52 52 p L 45 73 34 q min menor 19 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 2º Percurso: 19

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 73 34

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 73 34 q min menor 19 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 2º Percurso: 19

L main: Ordenar. Lista (L); ## 17 19 p 52 p L 45 73

L main: Ordenar. Lista (L); ## 17 19 p 52 p L 45 73 34 q min menor 19 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Iniciar novo percurso

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 min q

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 min q 73 34 min q menor 34 19 52 45 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 3º Percurso: 34 q

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 73 52

L main: Ordenar. Lista (L); ## 17 19 52 p L 45 73 52 min menor 34 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 3º Percurso: 34 q

L main: Ordenar. Lista (L); ## 17 19 34 p L 45 73 52

L main: Ordenar. Lista (L); ## 17 19 34 p L 45 73 52 min menor 34 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 3º Percurso: 34 q

L main: Ordenar. Lista (L); ## 17 19 34 p L 45 p 73

L main: Ordenar. Lista (L); ## 17 19 34 p L 45 p 73 52 min menor 34 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Iniciar novo percurso q

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 73 min

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 73 min 52 q min q menor 45 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 4º Percurso: 45 q

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 52 q

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 52 q min menor 45 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; - - - } 73 Ordenar. Lista p == min: não há troca Encontrado o menor elemento do 4º Percurso: 45

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 73 52

L main: Ordenar. Lista (L); ## 17 19 34 45 p L 73 52 q min p menor 45 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Iniciar novo percurso

L main: Ordenar. Lista (L); ## 17 19 34 45 73 min p L

L main: Ordenar. Lista (L); ## 17 19 34 45 73 min p L 52 min q menor 52 73 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 5º Percurso: 52 q

L main: Ordenar. Lista (L); ## 17 19 34 45 73 p L 73

L main: Ordenar. Lista (L); ## 17 19 34 45 73 p L 73 min menor 52 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 5º Percurso: 52 q

L main: Ordenar. Lista (L); ## 17 19 34 45 52 p L 73

L main: Ordenar. Lista (L); ## 17 19 34 45 52 p L 73 min menor 52 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Encontrado o menor elemento do 5º Percurso: 52 q

L main: Ordenar. Lista (L); ## 17 19 34 45 52 p L 73

L main: Ordenar. Lista (L); ## 17 19 34 45 52 p L 73 min p menor 52 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; Ordenar. Lista - - - } Iniciar novo percurso q

L main: Ordenar. Lista (L); ## 17 19 34 45 52 73 min L

L main: Ordenar. Lista (L); ## 17 19 34 45 52 73 min L menor 52 void Ordenar. Lista (lista L) { posicao p, q, min; int menor; - - - } p Ordenar. Lista Não há mais elementos a comparar com p->elem: Fim da ordenação q

menor 17 45 19 L ## 45 p 19 52 min Ordenar. Lista q

menor 17 45 19 L ## 45 p 19 52 min Ordenar. Lista q q 17 73 34 q min void Ordenar. Lista (lista L) { posicao p, q, min; int menor; for (p = L->prox; p != NULL && p->prox != NULL; p = p->prox) { for (menor = p->elem, min = p, q = p->prox; q != NULL; q = q->prox) { if (q->elem < menor) { menor = q->elem; min = q; } } if (min != p) { min->elem = p->elem; p->elem = menor; } } }

menor 17 L ## 17 p 52 Ordenar. Lista 19 45 73 34 q

menor 17 L ## 17 p 52 Ordenar. Lista 19 45 73 34 q min void Ordenar. Lista (lista L) { posicao p, q, min; int menor; for (p = L->prox; p != NULL && p->prox != NULL; p = p->prox) { for (menor = p->elem, min = p, q = p->prox; q != NULL; q = q->prox) { if (q->elem < menor) { menor = q->elem; min = q; } } if (min != p) { min->elem = p->elem; p->elem = menor; } } }

Exemplo: inserção e remoção em lista ordenada: int main () { lista L; printf

Exemplo: inserção e remoção em lista ordenada: int main () { lista L; printf ("Leitura de uma lista: nn"); L = Nova. Lista (); printf ("n. Lista inicial: "); Escrever. Lista (L); Ordenar. Lista (L); printf ("n. Lista ordenada: "); Escrever. Lista (L); Inserir (48, L); Remover (52, L); Remover (50, L); printf ("n. Lista modificada: "); Escrever. Lista (L); printf("nn"); system ("pause"); return 0; }

main: L ## 17 Inserir (48, L); 19 p L 34 48 45 52

main: L ## 17 Inserir (48, L); 19 p L 34 48 45 52 73 q num 48 void Inserir (int num, lista L) { posicao p, q; for (p = L; p->prox != NULL && p->prox->elem < num; p = p->prox); q = p->prox; p->prox = malloc (sizeof(noh)); p->prox->elem = num; p->prox = q; }

main: L ## 17 Remover (52, L); 19 p L 34 45 73 52

main: L ## 17 Remover (52, L); 19 p L 34 45 73 52 q num 52 void Remover (int num, lista L) { posicao p, q; for (p = L; p->prox != NULL && p->prox->elem < num; p = p->prox); if (p->prox != NULL && p->prox->elem == num) { q = p->prox; p->prox = q->prox; free (q); } }

main: L ## 17 Remover (50, L); 19 34 45 52 73 p L

main: L ## 17 Remover (50, L); 19 34 45 52 73 p L num 50 void Remover (int num, lista L) { posicao p, q; for (p = L; p->prox != NULL && p->prox->elem < num; p = p->prox); if (p->prox != NULL && p->prox->elem == num) { q = p->prox; p->prox = q->prox; A condição do if não é free (q); satisfeita: } Não há remoção }

Exemplo: função para repartir uma lista em outras duas: n Subprograma que recebe como

Exemplo: função para repartir uma lista em outras duas: n Subprograma que recebe como argumentos uma lista linear encadeada L, cujos elementos são números inteiros, e mais 2 outras listas de mesma espécie L 1, L 2, porém vazias; as três listas devem conter seus respectivos nós-líderes n O subprograma deve colocar em L 1 os nós de L cujos elementos são pares e, em L 2, aqueles cujos elementos são ímpares; no final, L deve conter apenas seu nó líder e os últimos nós das 3 listas devem apontar para NULL n Nenhum novo nó deve ser criado, nem se deve alterar

#include <stdio. h> #include <stdlib. h> typedef struct noh; typedef noh *lista; typedef noh

#include <stdio. h> #include <stdlib. h> typedef struct noh; typedef noh *lista; typedef noh *posicao; struct noh { int elem; noh *prox; }; - - void Separar. Pares. Impares (lista, lista);

List. Par L (main) ## ## (main) 45 List. Impar (main) 52 19 17

List. Par L (main) ## ## (main) 45 List. Impar (main) 52 19 17 73 ## int main () { lista L, List. Par, List. Impar; - - Separar. Pares. Impares (L, List. Par, List. Impar); - - } 34

List. Par L (main) ## (main) L 1 ## 45 52 19 17 73

List. Par L (main) ## (main) L 1 ## 45 52 19 17 73 34 L List. Impar (main) ## L 2 void Separar. Pares. Impares (lista L, lista L 1, lista L 2) { posicao p, q; main: Separar. Pares. Impares (L, List. Par, List. Impar);

List. Par L (main) ## (main) p L 1 ## L 45 19 52

List. Par L (main) ## (main) p L 1 ## L 45 19 52 p q List. Impar (main) 73 17 q q 34 q p ## L 2 q void Separar. Pares. Impares (lista L, lista L 1, lista L 2) { posicao p, q; main: Separar. Pares. Impares (L, List. Par, List. Impar);

void Separar. Pares. Impares (lista L, lista L 1, lista L 2) { posicao

void Separar. Pares. Impares (lista L, lista L 1, lista L 2) { posicao p, q; p = L 1; q = L 2; while (L->prox != NULL) { if (L->prox->elem % 2 == 0) { p->prox = L->prox; p = p->prox; } else { q->prox = L->prox; q = q->prox; } L->prox = L->prox; } p->prox = q->prox = NULL; }