exemplo: ordenação de uma lista pelo selection-sort: #include #include typedef struct noh noh;...

36
Exemplo: ordenação de uma lista pelo Exemplo: ordenação de uma lista pelo Selection-Sort: Selection-Sort: #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <stdlib.h> #include <conio.h> #include <conio.h> typedef struct noh noh; typedef struct noh noh; typedef noh *lista; typedef noh *lista; typedef noh *posicao; typedef noh *posicao; struct noh { struct noh { int elem; int elem; noh *prox; noh *prox; }; }; lista NovaLista (void); lista NovaLista (void); void EscreverLista (lista); void EscreverLista (lista); void OrdenarLista (lista); void OrdenarLista (lista);

Upload: internet

Post on 17-Apr-2015

166 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

Exemplo: ordenação de uma lista pelo Exemplo: ordenação de uma lista pelo Selection-Sort:Selection-Sort:

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef struct noh noh;typedef struct noh noh;

typedef noh *lista;typedef noh *lista;

typedef noh *posicao;typedef noh *posicao;

struct noh {struct noh {

int elem;int elem;

noh *prox;noh *prox;

};};

lista NovaLista (void);lista NovaLista (void);

void EscreverLista (lista);void EscreverLista (lista);

void OrdenarLista (lista);void OrdenarLista (lista);

Page 2: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void main () {void main () {

lista L;lista L;

printf ("Leitura de uma lista:\n\n");printf ("Leitura de uma lista:\n\n");

L = NovaLista ();L = NovaLista ();

printf ("\nLista inicial:");printf ("\nLista inicial:");

EscreverLista (L);EscreverLista (L);

OrdenarLista (L);OrdenarLista (L);

printf ("\nLista ordenada:");printf ("\nLista ordenada:");

EscreverLista (L);EscreverLista (L);

printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: ");

getch ();getch ();

}}

Page 3: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void main () {void main () {

lista L;lista L;

printf ("Leitura de uma lista:\n\n");printf ("Leitura de uma lista:\n\n");

L = NovaLista ();L = NovaLista ();

printf ("\nLista inicial:");printf ("\nLista inicial:");

EscreverLista (L);EscreverLista (L);

OrdenarLista (L);OrdenarLista (L);

printf ("\nLista ordenada:");printf ("\nLista ordenada:");

EscreverLista (L);EscreverLista (L);

printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: ");

getch ();getch ();

}}

L

##

45 52 1719 3473

main

Page 4: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

45 52 1719 3473

main: OrdenarLista (L);

OrdenarLista

L menor

p q min

Idéia do Método Selection-Sort

Page 5: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

45 52 1719 3473

main: OrdenarLista (L);

OrdenarLista

L menor

p

q min

45

min

q

q->elem < menor é falso

Avançar q

q

q->elem < menor é verdade

Atualizar menor e min e Avançar q

19

min

q

17

min

q q q

Encontrado o menor elemento do 1º Percurso: 17

Page 6: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

45 52 4519 3473

main: OrdenarLista (L);

OrdenarLista

L menor

p

17

min

q

Encontrado o menor elemento do 1º Percurso: 17

Page 7: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 52 4519 3473

main: OrdenarLista (L);

OrdenarLista

L menor

p

17

min

q

Encontrado o menor elemento do 1º Percurso: 17

Page 8: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 52 4519 3473

main: OrdenarLista (L);

OrdenarLista

L menor

p

17

min

Iniciar novo percurso

p q

Page 9: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 52 4519 3473

main: OrdenarLista (L);

OrdenarLista

L menor

17

min

qp

52

min

q

19

min

q q q

Encontrado o menor elemento do 2º Percurso: 19

Page 10: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 52 4552 3473

main: OrdenarLista (L);

OrdenarLista

L menor

qp

19

min

Encontrado o menor elemento do 2º Percurso: 19

Page 11: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4552 3473

main: OrdenarLista (L);

OrdenarLista

L menor

qp

19

min

Encontrado o menor elemento do 2º Percurso: 19

Page 12: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4552 3473

main: OrdenarLista (L);

OrdenarLista

L menor

qp

19

min

Iniciar novo percurso

p

Page 13: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4552 3473

main: OrdenarLista (L);

OrdenarLista

L menor

q

5219

min

p q

45

min

q q

34

min

Encontrado o menor elemento do 3º Percurso: 34

Page 14: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4552 5273

main: OrdenarLista (L);

OrdenarLista

L menor

qp

34

min

Encontrado o menor elemento do 3º Percurso: 34

Page 15: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

qp

34

min

Encontrado o menor elemento do 3º Percurso: 34

Page 16: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

qp

34

min

Iniciar novo percurso

p

Page 17: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

q

45

min

p min

q q

Encontrado o menor elemento do 4º Percurso: 45

Page 18: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

q

45

p min

Encontrado o menor elemento do 4º Percurso: 45

p == min: não há troca

Page 19: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

q

45

p min

Iniciar novo percurso

p

Page 20: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 5273

main: OrdenarLista (L);

OrdenarLista

L menor

q

73

min

p min

q

52

min

Encontrado o menor elemento do 5º Percurso: 52

Page 21: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 7373

main: OrdenarLista (L);

OrdenarLista

L menor

qp

52

min

Encontrado o menor elemento do 5º Percurso: 52

Page 22: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 7352

main: OrdenarLista (L);

OrdenarLista

L menor

qp

52

min

Encontrado o menor elemento do 5º Percurso: 52

Page 23: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 7352

main: OrdenarLista (L);

OrdenarLista

L menor

qp

52

min

Iniciar novo percurso

p

Page 24: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min;posicao p, q, min;

int menor;int menor;

- - - - -- - - - -

}}

L

##

17 19 4534 7352

main: OrdenarLista (L);

OrdenarLista

L menor

q

52

min

p

Não há mais elementos a comparar com p->elem: Fim da ordenação

Page 25: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min; int menor;posicao p, q, min; int menor;

for (p = L->prox; p != NULL && p->prox != NULL; for (p = L->prox; p != NULL && p->prox != NULL;

p = p->prox) {p = p->prox) {

for (menor = p->elem, min = p, q = p->prox; for (menor = p->elem, min = p, q = p->prox;

q != NULL; q = q->prox) {q != NULL; q = q->prox) {

if (q->elem < menor) {if (q->elem < menor) {

menor = q->elem; min = q;menor = q->elem; min = q;

}}

}}

if (min != p) {if (min != p) {

min->elem = p->elem; p->elem = menor;min->elem = p->elem; p->elem = menor;

}}

}}

}}

L

##

45 52 1719 3473

OrdenarLista

menor

p

45

min q q

19

min

17

minq

Page 26: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void OrdenarLista (lista L) {void OrdenarLista (lista L) {

posicao p, q, min; int menor;posicao p, q, min; int menor;

for (p = L->prox; p != NULL && p->prox != NULL; for (p = L->prox; p != NULL && p->prox != NULL;

p = p->prox) {p = p->prox) {

for (menor = p->elem, min = p, q = p->prox; for (menor = p->elem, min = p, q = p->prox;

q != NULL; q = q->prox) {q != NULL; q = q->prox) {

if (q->elem < menor) {if (q->elem < menor) {

menor = q->elem; min = q;menor = q->elem; min = q;

}}

}}

if (min != p) {if (min != p) {

min->elem = p->elem; p->elem = menor;min->elem = p->elem; p->elem = menor;

}}

}}

}}

L

##

17 52 4519 3473

OrdenarLista

menor

pq

min

17

Page 27: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

Exemplo: inserção e remoção em lista Exemplo: inserção e remoção em lista ordenada:ordenada:

void main () {void main () {lista L;lista L;printf ("Leitura de uma lista:\n\n");printf ("Leitura de uma lista:\n\n");L = NovaLista ();L = NovaLista ();printf ("\nLista inicial:");printf ("\nLista inicial:");EscreverLista (L);EscreverLista (L);

OrdenarLista (L);OrdenarLista (L);printf ("\nLista ordenada:");printf ("\nLista ordenada:");EscreverLista (L);EscreverLista (L);

Inserir (48, L);Inserir (48, L);Remover (52, L);Remover (52, L);

Remover (50, L);Remover (50, L);printf ("\nLista modificada:");printf ("\nLista modificada:");EscreverLista (L);EscreverLista (L);

printf("\n\nDigite algo para encerrar: ");printf("\n\nDigite algo para encerrar: "); getch ();getch ();}}

Page 28: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void Inserir (int num, lista L) {void Inserir (int num, lista L) {

posicao p, q;posicao p, q;

for (p = L; p->prox != NULL && p->prox->elem < num; for (p = L; p->prox != NULL && p->prox->elem < num;

p = p->prox);p = p->prox);

q = p->prox;q = p->prox;

p->prox = malloc (sizeof(noh));p->prox = malloc (sizeof(noh));

p->prox->elem = num;p->prox->elem = num;

p->prox->prox = q;p->prox->prox = q;

}}

L

##

17 19 4534 7352

main: Inserir (48, L);

L 48num

p q

48

Page 29: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void Remover (int num, lista L) {void Remover (int num, lista L) {

posicao p, q;posicao p, q;

for (p = L; p->prox != NULL && p->prox->elem < num; for (p = L; p->prox != NULL && p->prox->elem < num;

p = p->prox);p = p->prox);

if (p->prox != NULL && p->prox->elem == num) {if (p->prox != NULL && p->prox->elem == num) {

q = p->prox;q = p->prox;

p->prox = q->prox;p->prox = q->prox;

free (q);free (q);

}}

}}

L

##

17 19 4534 7352

main: Remover (52, L);

L 52num

p q

Page 30: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void Remover (int num, lista L) {void Remover (int num, lista L) {

posicao p, q;posicao p, q;

for (p = L; p->prox != NULL && p->prox->elem < num; for (p = L; p->prox != NULL && p->prox->elem < num;

p = p->prox);p = p->prox);

if (p->prox != NULL && p->prox->elem == num) {if (p->prox != NULL && p->prox->elem == num) {

q = p->prox;q = p->prox;

p->prox = q->prox;p->prox = q->prox;

free (q);free (q);

}}

}}

L

##

17 19 4534 7352

main: Remover (50, L);

L 50num

p

A condição do if não é satisfeita:

Não há remoção

Page 31: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

Exemplo: função para repartir uma lista em outras Exemplo: função para repartir uma lista em outras duas:duas:

Subprograma que receba como argumentos uma lista Subprograma que receba como argumentos uma lista linear encadeada linear encadeada LL, cujos elementos são números , cujos elementos são números inteiros, e mais 2 outras listas de mesma espécie inteiros, e mais 2 outras listas de mesma espécie L1L1, , L2L2, , porém vazias; as três listas devem conter seus porém vazias; as três listas devem conter seus respectivos nós-líderesrespectivos nós-líderes

O subprograma deve colocar em O subprograma deve colocar em L1L1 os nós de os nós de LL cujos cujos elementos são pares e, em elementos são pares e, em L2L2, aqueles cujos elementos , aqueles cujos elementos são ímpares; no final, são ímpares; no final, L L deve conter apenas seu nó líder deve conter apenas seu nó líder e os últimos nós das 3 listas devem apontar para NULL e os últimos nós das 3 listas devem apontar para NULL

Nenhum novo nó deve ser criado, nem se deve alterar o Nenhum novo nó deve ser criado, nem se deve alterar o conteúdo dos campos que guardam elementos de conteúdo dos campos que guardam elementos de qualquer nóqualquer nó

A ordem dos números em A ordem dos números em LL deve ser mantida em deve ser mantida em L1L1 e e L2L2

Page 32: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

#include <conio.h>#include <conio.h>

typedef struct noh noh;typedef struct noh noh;

typedef noh *lista;typedef noh *lista;

typedef noh *posicao;typedef noh *posicao;

struct noh {struct noh {

int elem;int elem;

noh *prox;noh *prox;

};};

- - - - -- - - - -

void SepararParesImpares (lista, lista, lista);void SepararParesImpares (lista, lista, lista);

Page 33: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void main () {void main () {

lista L, ListPar, ListImpar;lista L, ListPar, ListImpar;

- - - - -- - - - -

SepararParesImpares (L, ListPar, ListImpar);SepararParesImpares (L, ListPar, ListImpar);

- - - - -- - - - -

}}

L (main)

##

45 52 1719 3473

ListPar (main)

##

ListImpar (main)

##

Page 34: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void SepararParesImpares (lista L, lista L1, lista L2) {void SepararParesImpares (lista L, lista L1, lista L2) {

posicao p, q;posicao p, q;

L (main)

##

45 52 1719 3473

ListPar (main)

##

ListImpar (main)

##

main: SepararParesImpares (L, ListPar, ListImpar);

L1

L

L2

Page 35: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void SepararParesImpares (lista L, lista L1, lista L2) {void SepararParesImpares (lista L, lista L1, lista L2) {

posicao p, q;posicao p, q;

L (main)

##

45 52 1719 3473

ListPar (main)

##

ListImpar (main)

##

main: SepararParesImpares (L, ListPar, ListImpar);

L1

L2

p

q

qL

pq q q

p

Page 36: Exemplo: ordenação de uma lista pelo Selection-Sort: #include #include typedef struct noh noh; typedef noh *lista; typedef noh *posicao; struct noh { int

void SepararParesImpares (lista L, lista L1, lista L2) {void SepararParesImpares (lista L, lista L1, lista L2) {

posicao p, q;posicao p, q;

p = L1; q = L2;p = L1; q = L2;

while (L->prox != NULL) {while (L->prox != NULL) {

if (L->prox->elem % 2 == 0) {if (L->prox->elem % 2 == 0) {

p->prox = L->prox;p->prox = L->prox;

p = p->prox;p = p->prox;

}}

else {else {

q->prox = L->prox;q->prox = L->prox;

q = q->prox;q = q->prox;

}}

L->prox = L->prox->prox;L->prox = L->prox->prox;

}}

p->prox = q->prox = NULL;p->prox = q->prox = NULL;

}}