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á
Aula9
●
Lista (Remover)
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?
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?
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
Professor Roberto
Gustavo Guerra
Não podemos. Exato!
Lista do curso Lista do curso
VAZIA
Remover na lista
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
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
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
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
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
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
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
Remover na lista
Professor Roberto
Gustavo Guerra Gustavo
Gustavo, vamos começar com o inicio.
Concordo. Vamos sempre remover
no inicio.
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];
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
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--;
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
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.
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;
●
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];
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.
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 []);
Exemplo 1
int main(){
int lista[MAX], i, x;
i = 0;
while (!cheia(i)) {
scanf("%d", &x);
Inserir_Inicio(x, i, lista);
i++;
}
Exemplo 1
while (!vazia(i)) {
x = Retirar_Inicio(i, lista);
printf("Saiu elemento %d\n", x);
Imprimir(i, lista);
}
return 0;
}
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;
}
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;
}
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]);
} }
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;
}
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
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
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.
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];
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
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--;
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
Retirar no fim da lista estática
Na programação seria:
n--;
x = l[n];
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.
●
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];
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.
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 []);
Exemplo 2
int main(){
int lista[MAX], i, x;
i = 0;
while (!cheia(i)) {
scanf("%d", &x);
Inserir_Fim(x, i, lista);
i++;
}
Exemplo 2
while (!vazia(i)) {
x = Retirar_Fim(i, lista);
printf("Saiu elemento %d\n", x);
Imprimir(i, lista);
}
return 0;
}
Exemplo 2
bool vazia(int n) {
return (n == 0);
}
bool cheia(int n) {
return (n > MAX - 1);
}
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];
}
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]);
} }
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
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
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:
Inserir na lista
Professor Roberto
Gustavo Guerra Vamos procurar um
elemento e retirar Ele. Se o elemento não
tiver, avisar.
Beleza.
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];
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--;
●
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
●
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];
●
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--;
●
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--;
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
Professor Roberto
Gustavo Guerra Vamos fazer isso. Vamos criar uma função
retirar_procura (elemento).
Inserir antes do elemento
procurado da lista estática
Retirar_Procura (elemento)
●
O protótipo da função Inserir_Procura (elemento) é:
void retirar_Procura (int , int &, int []);
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--;
}
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”.
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 []);
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);
Exemplo 3
while (!vazia(i)) {
scanf("%d", &x);
Retirar_Procura(x, i, lista);
Imprimir(i, lista);
}
return 0;
}
Exemplo 3
bool vazia(int n) {
return (n == 0);
}
bool cheia(int n) {
return (n > MAX - 1);
}
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;
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;
}
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--;
}
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
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
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.
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.
Professor Gustavo Guerra Sim. Sem nada
não podemos retirar.
Vamos inicializar a lista e colocar
elementos.
Inserir na lista dinâmica
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.
Inserir na lista dinâmica
Professor Gustavo
Guerra Esse inicia a
lista.
Sim. Agora é só inserir elementos.
E ir retirando.
Vamos Retirar no inicio.
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];
●
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
●
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
51
4 2
Retirar no inicio da lista dinâmica
lista[0] = lista[1];
lista[1] = lista[2];
i--;
0
lista lista
1
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.
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;
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.
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 *);
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);
Exemplo 4
while (!vazia(i)) {
x = Retirar_Inicio(i, lista);
printf("Saiu elemento %d\n", x);
Imprimir(i, lista);
}
return 0;
}
Exemplo 4
bool vazia(int n) {
return (n == 0);
}
bool cheia(int n) {
return (n > MAX - 1);
}
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;
}
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]);
} }
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;
}
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
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
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.
●
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
●
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
●
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
●
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
51
4 2
i--;
3 0
lista
lista
51
Retirar no fim
da lista dinâmica
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
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];
}
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.
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 *);
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);
Exemplo 5
while (!vazia(i)) {
x = Retirar_Fim (i, lista);
printf("Saiu elemento %d\n", x);
Imprimir(i, lista);
}
return 0;
}
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);
}
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]);
}
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
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
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:
Retirar da lista
Professor Gustavo
Guerra Vamos procurar um
elemento e retirar.
Se o elemento não tiver, mandamos uma
mensagem.
Beleza.
●
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
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
●
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
●
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
71
5 2
8 3
9 4
1 5
2 6
●
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
51
8 2
9 3
1 4
2 5
●
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
51
8 2
9 3
1 4
1
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
Professor Gustavo Guerra Vamos fazer isso. Vamos criar uma função
retirar_procura (elemento).
Retirar elemento
da lista dinâmica
Retirar_Procura (elemento)
●
O protótipo da função Retirar_Procura (elemento) é:
void Retirar_Procura (int , int &, int *);
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--;
}
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”.
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 []);
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);
Exemplo 3
while (!vazia(i)) {
scanf("%d", &x);
Retirar_Procura(x, i, lista);
Imprimir(i, lista);
}
return 0;
}
Exemplo 3
bool vazia(int n) {
return (n == 0);
}
bool cheia(int n) {
return (n > MAX - 1);
}
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;
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;
}
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--;
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
Exemplo 1
●