• Nenhum resultado encontrado

Curso de Programação Nível 1. Roberto Affonso da Costa Junior Gustavo Luiz de Alvarenga Guerra Arthur Reznik Martins. Universidade Federal de Itajubá

N/A
N/A
Protected

Academic year: 2022

Share "Curso de Programação Nível 1. Roberto Affonso da Costa Junior Gustavo Luiz de Alvarenga Guerra Arthur Reznik Martins. Universidade Federal de Itajubá"

Copied!
127
0
0

Texto

(1)

Curso de Programação Nível 1

Roberto Affonso da Costa Junior Roberto Affonso da Costa Junior Gustavo Luiz de Alvarenga Guerra Gustavo Luiz de Alvarenga Guerra

Arthur Reznik Martins Arthur Reznik Martins

Universidade Federal de Itajubá

Universidade Federal de Itajubá

(2)

Aula9

Lista (Remover)

(3)

Introdução

Nas aulas anteriores, vimos a importância de inserir valores na lista. Agora vamos começar a remover dados na lista.

Primeira tarefa: Primeira tarefa: Criar a lista! Criar a lista!

Segunda tarefa: Segunda tarefa: Ela está vazia? Ela está vazia?

Terceira tarefa: Não está vazia. Onde retiro o dado? No Terceira tarefa: Não está vazia. Onde retiro o dado? No início? No meio? No fim?

início? No meio? No fim?

(4)

Remover na lista

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, vamos remover o pessoal na lista?

Roberto Roberto,

você quer remover, no inicio, no meio ou

no fim?

(5)

Professor Gustavo Guerra Gustavo

Gustavo, qual a diferença?

Roberto Roberto,

se a lista está vazia.

Como vamos retirar?

VAZIA Lista do curso Lista do curso

Remover na lista

(6)

Professor Roberto

Gustavo Guerra

Não podemos. Exato!

Lista do curso Lista do curso

VAZIA

Remover na lista

(7)

Professor Gustavo Guerra E se tiver um aluno

na lista é ele quem será retirado.

Nesse caso, não importar retirar no inicio, meio ou fim.

Aluno 1 Lista do curso Lista do curso

Remover na lista

(8)

Remover na lista

Professor Roberto

Gustavo Guerra Gustavo

Gustavo se tiver o aluno 2 no inicio da lista.

Como fica para

remover no incio? É só tirá-lo da lista.

Aluno 2 Aluno 1 Lista do curso Lista do curso

(9)

Remover na lista

Professor Gustavo

Guerra E se ele tiver

no fim?

Nesse caso, se retirar no incio

sai o Aluno 1.

Aluno 1 Aluno 2 Lista do curso Lista do curso

(10)

Remover na lista

Professor Roberto

Gustavo Guerra Nossa. Essa aula

vai ter muito o que ensinar.

E o pior RobertoRoberto, é que ainda não acabamos de ver.

Por exemplo,

se agora quiser remover no meio da lista.

Qual tirar?

Aluno 1 Aluno 2 Lista do curso Lista do curso

(11)

Remover na lista

Professor Gustavo

Guerra Nesse caso temos

que ter um terceiro aluno na lista.

Exatamente.

Podemos retirar do meio, se tivermos quantidade imparimpar de

elementos. E se for parpar? Temos que

decidir qual.

Aluno 1 Aluno 3 Aluno 2 Lista do curso Lista do curso

(12)

Remover na lista

Professor Roberto

Gustavo Guerra Então devemos pensar

em remover depois de um elemento.

Nesse caso temos uma Perguntas a fazer:

Antes ou depois do elemento?

Aluno 1 Aluno 2 Lista do curso Lista do curso

(13)

Remover na lista

Professor Gustavo

Guerra Nossa GustavoGustavo.

É muita coisa para ver.

Sim, temos muito que Estudar ainda.

Aluno 1 Aluno 2 Lista do curso Lista do curso

(14)

Remover na lista

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, vamos começar com o inicio.

Concordo. Vamos sempre remover

no inicio.

(15)

Retirar no inicio da lista estática

Uma lista estática é um vetor a qual definimos o tamanho dele. Nesse caso, para criar basta declarar o vetor:

Assim, temos na memória do computador 10 espaço preparados para receber os elementos.

10

0 1 2 3 4 5 6 7 8 9

lista lista

int lista[10];

(16)

Retirar no inicio da lista estática

Para Remover no inicio em um vetor estático devemos Para Remover no inicio em um vetor estático devemos seguir a forma de pensamento.

seguir a forma de pensamento.

Verificar se o vetor tem elemento. Basta ver se o elemento. Basta ver se o índice índice está está em 0.

em 0.

Se não tiver elemento, informamos que lista está vazia

0 1 2 3 4 5 6 7 8 9

lista

lista

(17)

Retirar no inicio da lista estática

Para tirar um único elemento no vetor é só fazer o Para tirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

5

00 1 2 3 4 5 6 7 8 9

lista lista

i--;

(18)

Retirar no inicio da lista estática

Se tiver Se tiver mais mais de 1 elementos no vetor. Para retirar o de 1 elementos no vetor. Para retirar o elemento do inicio, temos que andar com os demais uma elemento do inicio, temos que andar com os demais uma

posição para trás e diminuir o valor do

posição para trás e diminuir o valor do índice índice em uma em uma unidade.

unidade.

Se o vetor estiver assim:

Ele vai ficar assim:

3 5 4

0 1 2 33 4 5 6 7 8 9

lista lista

lista[0] = lista[1];

lista[1] = lista[2];

i--;

0 1 2 3 4 5 6 7 8 9

(19)

Remover no inicio da lista estática

Professor Gustavo

Guerra Gustavo

Gustavo, vamos ter que

trazer o último elemento

uma posição anterior,

até o inicio do vetor.

Exatamente RobertoRoberto.

Vamos criar uma função Retira_Inicio()

Retira_Inicio()

para fazer essa programação dentro dela.

Seria bom a função retornar o elemento

que retirou.

(20)

Retirar_Inicio ()

O protótipo da função Retirar_Inicio () é:

A função teria a seguinte forma:

int Retirar_Inicio(int &, int []);

int Retirar_Inicio(int &n, int l[]) {

int x, i;

x = l[0];

for (i = 0; i < n - 1; i++) { l[i] = l[i+1];

} n--;

return x;

(21)

Vale a pena comentar aqui a Vale a pena comentar aqui a função Retirar_Inicio que que criamos.

criamos.

Guarde o valor do inicio numa variável.

Mova todos os elemento uma unidade para trás. Colocando o elemento da posição i+1 na posição i+1 i até colocar o i elemento da posição n-2 na posição n-2 n-1. n-1

Retirar no inicio da lista estática

for (i = 0; i < n - 1; i++) { l[i] = l[i +1];

}

x = l[0];

(22)

Exemplo 1

Em uma lista só cabem 10 números inteiros. Faça um programa que leia números inteiros para lista, colocando cada elemento lido no início da lista, até ela ficar cheia.

Imprima a lista. Retire do inicio um elemento por vez,

mostre o elemento que saiu.

(23)

Exemplo 1

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Inicio(int, int, int []);

void Imprimir(int, int[]);

int Retirar_Inicio(int &, int []);

(24)

Exemplo 1

int main(){

int lista[MAX], i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Inicio(x, i, lista);

i++;

}

(25)

Exemplo 1

while (!vazia(i)) {

x = Retirar_Inicio(i, lista);

printf("Saiu elemento %d\n", x);

Imprimir(i, lista);

}

return 0;

}

(26)

Exemplo 1

bool vazia(int n) {

if (n == 0) return true;

else return false;

}

bool cheia(int n) {

if (n > MAX - 1) return true;

else return false;

}

(27)

Exemplo 1

void Inserir_Inicio(int elem, int n, int l[]) {

int i;

if (!vazia(n)) {

for (i = n; i > 0; i--) {

l[i] = l[i -1];

} }

l[0] = elem;

}

(28)

Exemplo 1

void Imprimir(int n, int l[]) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

} }

(29)

Exemplo 1

int Retirar_Inicio(int &n, int l[]) {

int x, i;

x = l[0];

for (i = 0; i < n - 1; i++) {

l[i] = l[i+1];

} n--;

return x;

}

(30)

Exemplo 1

Execute o programa anterior e entre com os valores:

Veja se a saída foi:

0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6

Saiu elemento 6 Saiu elemento 6 4 1 7 8 9 2 5 3 0 4 1 7 8 9 2 5 3 0 Saiu elemento 4 Saiu elemento 4 1 7 8 9 2 5 3 0 1 7 8 9 2 5 3 0 Saiu elemento 1 Saiu elemento 1 7 8 9 2 5 3 0

7 8 9 2 5 3 0

Saiu elemento 7

Saiu elemento 7

(31)

Exemplo 1

Continua:

Saiu elemento 8 Saiu elemento 8

9 2 5 3 0 9 2 5 3 0

Saiu elemento 9 Saiu elemento 9

2 5 3 0 2 5 3 0

Saiu elemento 2 Saiu elemento 2

5 3 0 5 3 0

Saiu elemento 5 Saiu elemento 5 3 0 3 0

Saiu elemento 3 Saiu elemento 3 0 0

Saiu elemento 0

Saiu elemento 0

(32)

Retirar na lista

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, já ensinamos retirar no inicio.

Vamos retirar no final.

Esse foi um pouco difícil, mas no final

é bem mais fácil.

Na verdade é diminuir o índice do vetor.

(33)

Retirar no fim da lista estática

Novamente, uma lista estática é um vetor a qual definimos o tamanho dele. Nesse caso, para criar basta declarar o vetor:

Assim, temos na memória do computador 10 espaço preparados para receber os elementos.

10

0 1 2 3 4 5 6 7 8 9

lista lista

int lista[10];

(34)

Retirar no fim da lista estática

Para Remover no fim em um vetor estático devemos seguir Para Remover no fim em um vetor estático devemos seguir a forma de pensamento.

a forma de pensamento.

Verificar se o vetor tem elemento. Basta ver se o elemento. Basta ver se o índice índice está está em 0.

em 0.

Se não tiver elemento, informamos que lista está vazia

0 1 2 3 4 5 6 7 8 9

lista

lista

(35)

Retirar no Fim da lista estática

Para tirar um único elemento no vetor é só fazer o Para tirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

5

00 1 2 3 4 5 6 7 8 9

lista lista

i--;

(36)

Retirar no fim da lista estática

Verificar qual a posição do ultimo elemento (o índice índice apontado sempre é um a mais que o do ultimo elemento).

Diminui-se o índice em uma unidade. índice em uma unidade

No exemplo, tem que tirar o número 5, mas o índice está na posição seguinte a do elemento. Basta diminuir o índice de 3 para 2 e esperar o próximo comando.

4 3 5

0 1 2 3 4 5 6 7 8 9

lista lista

4 3 5

0 1 22 3 4 5 6 7 8 9

lista

lista

(37)

Retirar no fim da lista estática

Na programação seria:

n--;

x = l[n];

(38)

Retirar no fim da lista estática

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, agora foi muito

fácil. É igual retirar o

elemento no vetor.

Exatamente RobertoRoberto.

Vamos criar uma função Retirar_fim ()

Retirar_fim ()

para fazer essa programação dentro dela.

Assim, no programa principal, podemos

só chamar e passar o elemento.

(39)

Vale a pena comentar aqui a Vale a pena comentar aqui a função Retirar_Fim que que criamos.

criamos.

Imprima o valor com a posição inicial .

Inserir no inicio da lista estática

return l[n-1];

(40)

Exemplo 2

Em uma lista só cabem 10 números inteiros. Faça um programa que leia números inteiros para lista, colocando cada elemento lido no fim da lista, até ela ficar cheia.

Imprima a lista. Retire do fim um elemento por vez, mostre

o elemento que saiu.

(41)

Exemplo 2

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Fim(int, int, int []);

void Imprimir(int, int[]);

int Retirar_Fim(int &, int []);

(42)

Exemplo 2

int main(){

int lista[MAX], i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Fim(x, i, lista);

i++;

}

(43)

Exemplo 2

while (!vazia(i)) {

x = Retirar_Fim(i, lista);

printf("Saiu elemento %d\n", x);

Imprimir(i, lista);

}

return 0;

}

(44)

Exemplo 2

bool vazia(int n) {

return (n == 0);

}

bool cheia(int n) {

return (n > MAX - 1);

}

(45)

Exemplo 2

void Inserir_Fim(int elem, int n, int l[]) {

l[n] = elem;

}

int Retirar_Fim(int &n, int l[]) {

n--;

return l[n];

}

(46)

Exemplo 1

void Imprimir(int n, int l[]) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

} }

(47)

Exemplo 2

Execute o programa anterior e entre com os valores:

Veja se a saída foi:

0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6

Saiu elemento 6 Saiu elemento 6 0 3 5 2 9 8 7 1 4 0 3 5 2 9 8 7 1 4 Saiu elemento 4 Saiu elemento 4 0 3 5 2 9 8 7 1 0 3 5 2 9 8 7 1 Saiu elemento 1 Saiu elemento 1 0 3 5 2 9 8 7

0 3 5 2 9 8 7

Saiu elemento 7

Saiu elemento 7

(48)

Exemplo 2

Continua:

Saiu elemento 8 Saiu elemento 8

9 2 5 3 0 9 2 5 3 0

Saiu elemento 9 Saiu elemento 9

2 5 3 0 2 5 3 0

Saiu elemento 2 Saiu elemento 2

5 3 0 5 3 0

Saiu elemento 5 Saiu elemento 5 3 0 3 0

Saiu elemento 3 Saiu elemento 3 0 0

Saiu elemento 0

Saiu elemento 0

(49)

Inserir na lista

Professor Gustavo

Guerra Gustavo

Gustavo, e agora como vamos ensinar

retirar no meio?

Roberto

Roberto, podemos escolher,

tem vários modos.

acho melhor adotar o seguinte:

(50)

Inserir na lista

Professor Roberto

Gustavo Guerra Vamos procurar um

elemento e retirar Ele. Se o elemento não

tiver, avisar.

Beleza.

(51)

Retirar elemento procurado da lista estática

Criando uma lista estática. Nesse caso é só declarar o vetor:

Assim, temos na memória do computador 10 espaço preparados para receber os elementos.

10

0 1 2 3 4 5 6 7 8 9

lista lista

int lista[10];

(52)

Retirar no inicio da lista estática

Para tirar um único elemento no vetor é só fazer o Para tirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

5

00 1 2 3 4 5 6 7 8 9

lista lista

i--;

(53)

Para Retirar um elemento dado, temos que pesquisar na lista Para Retirar um elemento dado, temos que pesquisar na lista se ele existe. Se não existir mandamos mensagem avisando.

se ele existe. Se não existir mandamos mensagem avisando.

Se existir Se existir

Primeiro verificar se o vetor está vazio Basta ver se o Basta ver se o índice índice está em 0.

está em 0.

Se não tiver elemento, informamos que lista está vazia e não pode retirar aquele elemento.

0 1 2 3 4 5 6 7 8 9

lista lista

Retirar elemento procurado

da lista estática

(54)

Se o vetor tiver elemento, devemos procurar por ele na lista. Se o vetor tiver elemento, devemos procurar por ele na lista.

Se não encontrar manda-se uma mensagem de “não Se não encontrar manda-se uma mensagem de “não

encontrado”, se tiver na lista segue o procedimento.

encontrado”, se tiver na lista segue o procedimento.

Vamos retirar o elemento 4 no vetor a seguir.

Ele está na posição 0 da lista. Nesse caso, guarda-se o elemento da posição 0 em uma variável e coloca na posição 0 o elemento da posição 1. Assim sucessivamente até o final da lista. Diminui a quantidade da lista em uma unidade.

4 7 5 8 9 1 2

0 1 2 3 4 5 6 7 8 9

lista lista

Retirar elemento procurado da lista estática

lista[n] = lista[n+1];

(55)

Vamos retirar o elemento 2 no vetor a seguir.

Ele está na posição 5 (n-1) da lista. Nesse caso, diminui-se a quantidade da lista em uma unidade.

7 5 8 9 1 2

0 1 2 3 4 5 6 7 8 9

lista lista

Retirar elemento procurado da lista estática

n--;

(56)

Vamos retirar o elemento 8 no vetor a seguir.

Ele está na posição 2 da lista. Para retirá-lo basta colocar o elemento da posição 3 na posição 2 e o elemento da posição 4 na posição 3. E diminuir a quantidade da lista em uma unidade.

7 5 8 9 1

0 1 2 3 4 5 6 7 8 9

lista lista

Retirar elemento procurado da lista estática

lista[n] = lista[n+1];

n--;

(57)

Professor Gustavo Guerra Gustavo

Gustavo, vai ser fácil programar.

Roberto

Roberto, quando retiramos no meio é idêntico a

retirar no inicio, basta adaptar o

movimento.

Inserir antes do elemento

procurado da lista estática

(58)

Professor Roberto

Gustavo Guerra Vamos fazer isso. Vamos criar uma função

retirar_procura (elemento).

Inserir antes do elemento

procurado da lista estática

(59)

Retirar_Procura (elemento)

O protótipo da função Inserir_Procura (elemento) é:

void retirar_Procura (int , int &, int []);

(60)

Retirar_Procura (elemento)

A função teria a seguinte forma:

void Retirar_Procura(int elem, int &n, int l[]) {

int i, proc;

proc = Busca(elem, n, l);

for (i = proc; i < n - 1; i++) {

l[i] = l[i+1];

}

if (proc == n)

printf("Valor nao encontrado\n");

else n--;

}

(61)

Exemplo 3

Uma lista só cabem 10 números inteiros. Faça um programa

que leia números inteiros para lista, colocando no final da

lista. Coloque os elementos até a lista estar cheia. Imprima

os valores do vetor no final. Em seguida, vá retirando os

valores da lista, até ela ficar vazia. Se não tiver um elemento

na lista, mostre a mensagem: “Valor nao encontrado”.

(62)

Exemplo 3

O programa fica:

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Fim(int, int, int []);

void Imprimir(int, int[]);

void Retirar_Procura (int, int &, int []);

int Busca (int, int, int []);

(63)

Exemplo 3

int main(){

int lista[MAX], i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Fim(x, i, lista);

i++;

}

Imprimir(i, lista);

(64)

Exemplo 3

while (!vazia(i)) {

scanf("%d", &x);

Retirar_Procura(x, i, lista);

Imprimir(i, lista);

}

return 0;

}

(65)

Exemplo 3

bool vazia(int n) {

return (n == 0);

}

bool cheia(int n) {

return (n > MAX - 1);

}

(66)

Exemplo 3

void Imprimir(int n, int l[]) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

} }

void Inserir_Fim(int elem, int n, int l[]) {

l[n] = elem;

(67)

Exemplo 3

int Busca (int proc, int n, int l[]) {

int i, achei = n;

for (i = 0; i < n; i++) { if (proc == l[i]) {

achei = i;

break;

} }

return achei;

}

(68)

Exemplo 3

void Retirar_Procura(int elem, int &n, int l[]) {

int i, proc;

proc = Busca(elem, n, l);

for (i = proc; i < n - 1; i++) {

l[i] = l[i+1];

}

if (proc == n)

printf("Valor nao encontrado\n");

else n--;

}

(69)

Exemplo 1

Execute o programa anterior e entre com os valores e veja a saída:

2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 7 7

2 4 3 5 1 8 9 0 6 2 4 3 5 1 8 9 0 6 4 4

2 3 5 1 8 9 0 6 2 3 5 1 8 9 0 6 2 2

3 5 1 8 9 0 6 3 5 1 8 9 0 6 6 6

3 5 1 8 9 0

3 5 1 8 9 0

0 0

(70)

Exemplo 1

Continuação: 4 4

Valor nao encontrado Valor nao encontrado

3 5 1 8 9 3 5 1 8 9 1 1

3 5 8 9 3 5 8 9 8 8

3 5 9 3 5 9 2 2

Valor nao encontrado Valor nao encontrado

3 5 9 3 5 9 5 5

3 9 3 9

9 9

3 3

(71)

Introdução

Podemos implementar uma lista encadeada de duas maneiras: com cabeça e sem cabeça com cabeça sem cabeça.

Onde a cabeça de uma lista seria um nó, que foi declarado explicitamente no início do programa.

Não usaremos, na verdade, o conteúdo deste nó, também chamado de célula ou cabeça, pois como veremos, ele não célula ou cabeça será relevante.

Ele serve para sinalizar o início da lista, para sabermos que início da lista

ela inicia ali, naquele endereço fixo de memória.

(72)

Inserir na lista dinâmica

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, vamos ensinar o pessoal, como retira

lista dinâmica.

Roberto

Roberto, vamos.

Não esquece de ver se a lista está vazia.

Assim não podemos retirar.

(73)

Professor Gustavo Guerra Sim. Sem nada

não podemos retirar.

Vamos inicializar a lista e colocar

elementos.

Inserir na lista dinâmica

(74)

Inserir na lista dinâmica

Professor Roberto

Gustavo Guerra Para inicializar,

temos que fazer o que?

Fazemos:

int* lista = new int[0];

int* lista = new int[0];

Sem cabeça.

(75)

Inserir na lista dinâmica

Professor Gustavo

Guerra Esse inicia a

lista.

Sim. Agora é só inserir elementos.

E ir retirando.

Vamos Retirar no inicio.

(76)

Retirar no inicio da lista dinâmica

Para trabalharmos com lista encadeada de forma similar ao vetor, basta iniciar a lista como um ponteiro.

Assim temos:

0

lista lista

int *lista = new int[0];

(77)

Para retirar um único elemento no vetor é só fazer o Para retirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

i--;

5 0

lista lista

Retirar no inicio

da lista dinâmica

(78)

Se tiver Se tiver mais mais de 1 elementos no vetor. Para retirar o de 1 elementos no vetor. Para retirar o elemento do inicio, temos que andar com os demais uma elemento do inicio, temos que andar com os demais uma

posição para trás e diminuir o valor do

posição para trás e diminuir o valor do índice índice em uma em uma unidade.

unidade.

Se o vetor estiver assim:

Ele vai ficar assim:

3 0

lista

lista

5

1

4 2

Retirar no inicio da lista dinâmica

lista[0] = lista[1];

lista[1] = lista[2];

i--;

0

lista lista

1

(79)

Professor Gustavo Guerra Sim RobertoRoberto.

Só que agora a lista é um ponteiro.

Inserir no inicio da lista dinâmica

Gustavo

Gustavo essa

implementação é igual a retirar da lista

estática.

(80)

Retirar_Inicio ()

O protótipo da função Retirar_Inicio () é:

A função teria a seguinte forma:

int Retirar_Inicio(int &, int *);

int Retirar_Inicio(int &n, int *l) {

int x, i;

x = l[0];

for (i = 0; i < n - 1; i++) { l[i] = l[i+1];

} n--;

return x;

(81)

Exemplo 4

Em uma lista só cabem 10 números inteiros. Faça um programa que leia números inteiros para lista, colocando cada elemento lido no início da lista, até ela ficar cheia.

Imprima a lista. Retire do inicio um elemento por vez,

mostre o elemento que saiu.

(82)

Exemplo 4

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Inicio(int, int, int *);

void Imprimir(int, int *);

int Retirar_Inicio(int &, int *);

(83)

Exemplo 4

int main(){

int *lista = new int[0];

int i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Inicio(x, i, lista);

i++;

}

Imprimir(i, lista);

(84)

Exemplo 4

while (!vazia(i)) {

x = Retirar_Inicio(i, lista);

printf("Saiu elemento %d\n", x);

Imprimir(i, lista);

}

return 0;

}

(85)

Exemplo 4

bool vazia(int n) {

return (n == 0);

}

bool cheia(int n) {

return (n > MAX - 1);

}

(86)

Exemplo 4

void Inserir_Inicio(int elem, int n, int *l) {

int i;

if (!vazia(n)) {

for (i = n; i > 0; i--) {

l[i] = l[i -1];

} }

l[0] = elem;

}

(87)

Exemplo 4

void Imprimir(int n, int *l) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

} }

(88)

Exemplo 4

int Retirar_Inicio(int &n, int *l) {

int x, i;

x = l[0];

for (i = 0; i < n - 1; i++) {

l[i] = l[i+1];

} n--;

return x;

}

(89)

Exemplo 4

Execute o programa anterior e entre com os valores e veja a saída:

0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6 6 4 1 7 8 9 2 5 3 0 6 4 1 7 8 9 2 5 3 0

Saiu elemento 6 Saiu elemento 6 4 1 7 8 9 2 5 3 0 4 1 7 8 9 2 5 3 0 Saiu elemento 4 Saiu elemento 4

1 7 8 9 2 5 3 0 1 7 8 9 2 5 3 0

Saiu elemento 1 Saiu elemento 1

7 8 9 2 5 3 0 7 8 9 2 5 3 0

Saiu elemento 7 Saiu elemento 7

8 9 2 5 3 0

8 9 2 5 3 0

(90)

Exemplo 4

Continua:

Saiu elemento 8 Saiu elemento 8

9 2 5 3 0 9 2 5 3 0

Saiu elemento 9 Saiu elemento 9

2 5 3 0 2 5 3 0

Saiu elemento 2 Saiu elemento 2

5 3 0 5 3 0

Saiu elemento 5 Saiu elemento 5 3 0 3 0

Saiu elemento 3 Saiu elemento 3 0 0

Saiu elemento 0

Saiu elemento 0

(91)

retirar na lista

Professor Gustavo

Guerra Gustavo

Gustavo, já ensinamos retira no inicio.

Agora vamos retirar no final.

Na verdade é só recuar a posição do vetor em

uma unidade.

(92)

Criando a lista:

Assim, temos na memória do computador.

0

lista lista

int *lista = new int[0];

Retirar no fim

da lista dinâmica

(93)

Para Remover no fim em um vetor estático devemos seguir Para Remover no fim em um vetor estático devemos seguir a forma de pensamento.

a forma de pensamento.

Verificar se o vetor tem elemento. Basta ver se o elemento. Basta ver se o índice índice está está em 0.

em 0.

Se não tiver elemento, informamos que lista está vazia

0

lista lista

Retirar no fim

da lista dinâmica

(94)

Para tirar um único elemento no vetor é só fazer o Para tirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

i--;

5 0

lista lista

Retirar no fim

da lista dinâmica

(95)

Se tiver Se tiver mais mais de 1 elementos no vetor. Para retirar o de 1 elementos no vetor. Para retirar o elemento do inicio, temos diminuir o valor do

elemento do inicio, temos diminuir o valor do índice em índice em uma unidade.

uma unidade.

Se o vetor estiver assim:

Ele vai ficar assim:

3 0

lista

lista

5

1

4 2

i--;

3 0

lista

lista

5

1

Retirar no fim

da lista dinâmica

(96)

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, agora foi muito

fácil. É igual retirar o

elemento no vetor.

Exatamente RobertoRoberto.

Vamos criar uma função Retirar_Fim ()

Retirar_Fim ()

para fazer essa programação dentro dela.

Assim, no programa principal, podemos

só chamar e pegar o elemento que

foi retirado.

Retirar no fim

da lista dinâmica

(97)

Retirar_Fim ()

O protótipo da função Retirar_Fim () é:

A função teria a seguinte forma:

int Retirar_Fim (int &, int *);

int Retirar_Fim(int &n, int *l) {

n--;

return l[n];

}

(98)

Exemplo 5

Em uma lista só cabem 10 números inteiros. Faça um programa que leia números inteiros para lista, colocando cada elemento lido no fim da lista, até ela ficar cheia.

Imprima a lista. Retire do fim um elemento por vez, mostre

o elemento que saiu.

(99)

Exemplo 5

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Fim (int, int, int *);

void Imprimir(int, int *);

int Retirar_Fim (int &, int *);

(100)

Exemplo 5

int main(){

int *lista = new int[0];

int i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Fim (x, i, lista);

i++;

}

Imprimir(i, lista);

(101)

Exemplo 5

while (!vazia(i)) {

x = Retirar_Fim (i, lista);

printf("Saiu elemento %d\n", x);

Imprimir(i, lista);

}

return 0;

}

(102)

Exemplo 5

void Inserir_Fim(int elem, int n, int *l) {

l[n] = elem;

}

bool vazia(int n) {

return (n == 0);

}

bool cheia(int n) {

return (n > MAX - 1);

}

(103)

Exemplo 5

int Retirar_Fim(int &n, int *l) {

n--;

return l[n];

}

void Imprimir(int n, int *l) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

}

(104)

Exemplo 5

Execute o programa anterior e entre com os valores e veja a saída:

0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6 0 3 5 2 9 8 7 1 4 6

Saiu elemento 6 Saiu elemento 6 0 3 5 2 9 8 7 1 4 0 3 5 2 9 8 7 1 4 Saiu elemento 4 Saiu elemento 4

0 3 5 2 9 8 7 1 0 3 5 2 9 8 7 1

Saiu elemento 1 Saiu elemento 1

0 3 5 2 9 8 7 0 3 5 2 9 8 7

Saiu elemento 7 Saiu elemento 7

0 3 5 2 9 8

0 3 5 2 9 8

(105)

Exemplo 5

Continua:

Saiu elemento 8 Saiu elemento 8

0 3 5 2 9 0 3 5 2 9

Saiu elemento 9 Saiu elemento 9

0 3 5 2 0 3 5 2

Saiu elemento 2 Saiu elemento 2

0 3 5 0 3 5

Saiu elemento 5 Saiu elemento 5 0 3 0 3

Saiu elemento 3 Saiu elemento 3 0 0

Saiu elemento 0

Saiu elemento 0

(106)

Retirar da lista

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, e agora como vamos ensinar

retirar no meio?

Roberto

Roberto, podemos escolher,

tem vários modos.

acho melhor adotar o seguinte:

(107)

Retirar da lista

Professor Gustavo

Guerra Vamos procurar um

elemento e retirar.

Se o elemento não tiver, mandamos uma

mensagem.

Beleza.

(108)

Criando uma lista dinâmica:

Assim, temos na memória do computador.

int *lista = new int[0];

0

lista lista

Retirar elemento

da lista dinâmica

(109)

Retirar elemento da lista dinâmica

Para tirar um único elemento no vetor é só fazer o Para tirar um único elemento no vetor é só fazer o índice índice voltar a 0, pois se tem um elemento o

voltar a 0, pois se tem um elemento o índice índice estará em 1. estará em 1.

Ficando assim o vetor. Se a posição é 0 o valor 5 vai ser substituído quando inserir novamente o valor.

i--;

5 0

lista

lista

(110)

Para Retirar um elemento dado, temos que pesquisar na lista Para Retirar um elemento dado, temos que pesquisar na lista se ele existe. Se não existir mandamos mensagem avisando.

se ele existe. Se não existir mandamos mensagem avisando.

Se existir Se existir

Primeiro verificar se o vetor está vazio Basta ver se o Basta ver se o índice índice está em 0.

está em 0.

Se não tiver elemento, informamos que lista está vazia e não pode retirar aquele elemento.

Retirar elemento da lista dinâmica

0

lista

lista

(111)

Se o vetor tiver elemento, devemos procurar por ele na lista. Se o vetor tiver elemento, devemos procurar por ele na lista.

Se não encontrar manda-se uma mensagem de “não Se não encontrar manda-se uma mensagem de “não

encontrado”, se tiver na lista segue o procedimento.

encontrado”, se tiver na lista segue o procedimento.

Vamos retirar o elemento 4 no vetor a seguir.

Ele está na posição 0 da lista. Nesse caso, guarda-se o elemento da posição 0 em uma variável e coloca na posição 0 o elemento da posição 1. Assim sucessivamente até o final da lista. Diminui a quantidade da lista em uma unidade.

Retirar elemento da lista dinâmica

lista[n] = lista[n+1];

4 0

lista

lista

7

1

5 2

8 3

9 4

1 5

2 6

(112)

Vamos retirar o elemento 2 no vetor a seguir.

Ele está na posição 5 (n-1) da lista. Nesse caso, diminui-se a quantidade da lista em uma unidade.

Retirar elemento da lista dinâmica

n--;

7 0

lista

lista

5

1

8 2

9 3

1 4

2 5

(113)

Vamos retirar o elemento 8 no vetor a seguir.

Ele está na posição 2 da lista. Para retirá-lo basta colocar o elemento da posição 3 na posição 2 e o elemento da posição 4 na posição 3. E diminuir a quantidade da lista em uma unidade.

Retirar elemento da lista dinâmica

lista[n] = lista[n+1];

n--;

7 0

lista

lista

5

1

8 2

9 3

1 4

1

(114)

Professor Roberto

Gustavo Guerra Gustavo

Gustavo, vai ser fácil programar.

Roberto

Roberto, quando retiramos no meio é idêntico a

retirar no inicio, basta adaptar o

movimento.

Retirar elemento

da lista dinâmica

(115)

Professor Gustavo Guerra Vamos fazer isso. Vamos criar uma função

retirar_procura (elemento).

Retirar elemento

da lista dinâmica

(116)

Retirar_Procura (elemento)

O protótipo da função Retirar_Procura (elemento) é:

void Retirar_Procura (int , int &, int *);

(117)

Retirar_Procura (elemento)

A função teria a seguinte forma:

void Retirar_Procura(int elem, int &n, int l[]) {

int i, proc;

proc = Busca(elem, n, l);

for (i = proc; i < n - 1; i++) {

l[i] = l[i+1];

}

if (proc == n)

printf("Valor nao encontrado\n");

else n--;

}

(118)

Exemplo 3

Uma lista só cabem 10 números inteiros. Faça um programa

que leia números inteiros para lista, colocando no final da

lista. Coloque os elementos até a lista estar cheia. Imprima

os valores do vetor no final. Em seguida, vá retirando os

valores da lista, até ela ficar vazia. Se não tiver um elemento

na lista, mostre a mensagem: “Valor nao encontrado”.

(119)

Exemplo 3

O programa fica:

#include <bits/stdc++.h>

using namespace std;

#define MAX 10 bool vazia(int);

bool cheia(int);

void Inserir_Fim(int, int, int []);

void Imprimir(int, int[]);

void Retirar_Procura (int, int &, int []);

int Busca (int, int, int []);

(120)

Exemplo 3

int main(){

int lista[MAX], i, x;

i = 0;

while (!cheia(i)) {

scanf("%d", &x);

Inserir_Fim(x, i, lista);

i++;

}

Imprimir(i, lista);

(121)

Exemplo 3

while (!vazia(i)) {

scanf("%d", &x);

Retirar_Procura(x, i, lista);

Imprimir(i, lista);

}

return 0;

}

(122)

Exemplo 3

bool vazia(int n) {

return (n == 0);

}

bool cheia(int n) {

return (n > MAX - 1);

}

(123)

Exemplo 3

void Imprimir(int n, int l[]) {

int j;

for (j = 0; j < n; j++) {

if (j < n - 1) printf("%d ", l[j]);

else printf("%d\n", l[j]);

} }

void Inserir_Fim(int elem, int n, int l[]) {

l[n] = elem;

(124)

Exemplo 3

int Busca (int proc, int n, int l[]) {

int i, achei = n;

for (i = 0; i < n; i++) { if (proc == l[i]) {

achei = i;

break;

} }

return achei;

}

(125)

Exemplo 3

void Retirar_Procura(int elem, int &n, int l[]) {

int i, proc;

proc = Busca(elem, n, l);

for (i = proc; i < n - 1; i++) {

l[i] = l[i+1];

}

if (proc == n)

printf("Valor nao encontrado\n");

else n--;

(126)

Exemplo 1

Execute o programa anterior e entre com os valores e veja a saída:

2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 2 4 3 5 1 7 8 9 0 6 7 7

2 4 3 5 1 8 9 0 6 2 4 3 5 1 8 9 0 6 4 4

2 3 5 1 8 9 0 6 2 3 5 1 8 9 0 6 2 2

3 5 1 8 9 0 6 3 5 1 8 9 0 6 6 6

3 5 1 8 9 0

3 5 1 8 9 0

0 0

(127)

Exemplo 1

Continuação: 4 4

Valor nao encontrado Valor nao encontrado

3 5 1 8 9 3 5 1 8 9 1 1

3 5 8 9 3 5 8 9 8 8

3 5 9 3 5 9 2 2

Valor nao encontrado Valor nao encontrado

3 5 9 3 5 9 5 5

3 9 3 9

9 9

3 3

Referências

Documentos relacionados

 Cada elemento (nó) da lista contém um dado armazenado e um apontador para o próximo elemento da lista?.  Estrutura recursiva com

intitulado “O Plano de Desenvolvimento da Educação: razões, princípios e programas” (BRASIL, 2007d), o PDE tem a intenção de “ser mais do que a tradução..

Dessa forma, diante das questões apontadas no segundo capítulo, com os entraves enfrentados pela Gerência de Pós-compra da UFJF, como a falta de aplicação de

Os candidatos reclassificados deverão cumprir os mesmos procedimentos estabelecidos nos subitens 5.1.1, 5.1.1.1, e 5.1.2 deste Edital, no período de 15 e 16 de junho de 2021,

Janaína Oliveira, que esteve presente em Ouagadougou nas últimas três edições do FESPACO (2011, 2013, 2015) e participou de todos os fóruns de debate promovidos

Foram analisados a relação peso-comprimento e o fator de condição de Brycon opalinus, em três rios do Parque Estadual da Serra do Mar-Núcleo Santa Virgínia, Estado de São

ABSTRACT: The toxicological effects of crude ethanolic extracts (CEE) of the seed and bark of Persea americana have been analyzed on larvae and pupae of

Concluindo, Zabala identifica e diferencia a concepção tradicional da concepção construtivista, a partir dos dois referenciais básicos para a análise da prática.