Post on 17-Apr-2015
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);
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 ();
}}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 ();}}
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
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
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
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
#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);
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)
##
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
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
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;
}}