Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var.

Slides:



Advertisements
Apresentações semelhantes
Estruturação de Linguagens (Pascal e C++)
Advertisements

ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
Listas encadeadas Prof. Rosana Palazon.
Estrutura de Dados I Profº.: ABC Sampaio
Adaptado de material da profa. Maria Aparecida Livi
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Estruturas de Dados e Algoritmos
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Construção de Compiladores
Algoritmos e Estruturas de Dados II
Universidade de Brasília
Sincronização e Comunicação entre Processos
Robson Godoi / Sandra Siebra
Ponteiros.
Robson Godoi / Sandra Siebra
Listas Encadeadas.
Revisão da Linguagem C.
O Portal do Estudante de Computação
O Portal do Estudante de Computação
GAUSS COM PIVOTEAMENTO
Paradigmas de programação
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Algoritmos e Estruturas de Dados
ALGORITMOS E ESTRUTURAS DE DADOS
Prof. Hilton Cardoso Marins Junior LISTA LINEAR
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
João Lucas de Oliveira Torres
Variáveis, Tipos de Dados e Constantes
LISTAS DUPLAMENTE ENCADEADAS
Linguagem de Programação II Parte IX
Definição de Tipos Estruturas e Ponteiros
Introdução a Programação COM 100 Aula 07 Procedimentos.
INTELIGÊNCIA ARTIFICIAL
Listas duplamente encadeadas Estrutura: tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Ant: tPtNo Dado: tDado; Prox: tPtNo; end; var.
Procedure PercPreOrdem(a: tPtNo); var q: tPtNo; P: tPilha; begin Inicializa(P); Empilhar(P,a); while not PilhaVazia(P) do begin q:= Topo(P); Desempilhar(P);
Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var.
Implementação de FILAS com Alocação Dinâmica
Introdução ao uso de vatores na linguagem PASCAL.
Aula 3 Vetores e Listas. Arrays (vetores) Array – sequência de elementos do mesmo tipo. Tamanho do Array – seu número de elementos (número fixo) Consequência:
Computação Eletrônica
Ambiente de Execução - Rotinas
Computação Eletrônica Subprograma. Função O que este programa faz? Program funcao; var n,x: real; begin write('Entre n: '); readln(n); x := cos(n); write(x);
Capítulo III Modularização Procedimentos e Funções Universidade Federal de São Carlos Departamento de Computação Aluna: Luanna Lopes Lobato
Linguagem Pascal Prof. Sérgio Rodrigues.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
ARQUIVOS.
Aula 04 – 22/03 Listas Duplamente Encadeada – Listas Encadeada Circular – Lista Duplamente Encadeada Circular.
Estruturas de Dados Aula 17: Estruturas Genéricas
“Introdução a Computação” Capítulo II Estruturas de Dados
VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS (VETORES)
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Aula 06 – 05/04 Árvores binárias.
Prof. Alessandro Gonçalves
Professor Ulisses Vasconcelos
Estruturas de Dados + Algoritmos = Programas
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Prof Ulisses Vasconcelos ESTRUTURA DE DADOS AULA 02 - PILHA Conceito Inserção Remoção.
Strings.
Introdução à Programação
AULA 09 PROGRAMAÇÃO I. Estruturas de Dados Heterogêneas 10/08/2010 Programação I 2 Objetivo: Estudar os tipos de dados heterogêneos:  Registros;  Arrays.
Computação Eletrônica Strings. Strings (Cadeias de Caracteres) Um string é um texto. Em Pascal, este texto deve ser delimitado por aspas simples. Exemplo:
Estruturas de Dados Murilo Salgado Razoli.
Estrutura de Dados Aula 3 - Listas
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Computadores vs. Programas / Algoritmos Computadores vs. Programas -> Algoritmos O tratamento de problemas através do computador geralmente envolve uma.
Linguagem de Programação
Lista Ligada Estrutura de Dados II Prof. Gale. Vantagens  Crescem (ou decrescem) à medida que elementos são inseridos (ou removidos)  seqüência encadeada.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
SUB-ROTINAS EM PASCAL PROGRAMAÇÃO MODULARIZADA 252.
Transcrição da apresentação:

Ponteiros em Pascal Variáveis ponteiros são aquelas que guardam o endereço de outra, possibilitando o acesso a seu conteúdo. Declaração em Pascal:  var ptInt: ^integer; {ponteiro para uma variável inteira } ptReal: ^real; {ponteiro para uma variável real}

Operador unário que obtém o endereço de uma variável   Operador unário que obtém o endereço de uma variável program soma; var S,A,B:integer; PtS,PtA,PtB : ^integer; begin readln(A,B); PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; writeln('Resultado: ',PtS^); end.

Alocação de memória PtA PtB PtS A B S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.  PtA PtB PtS A B S

Alocação de memória PtA PtB PtS A 2 B S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end.  PtA PtB PtS A 2 B S

Alocação de memória PtA PtB PtS A 2 B 3 S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS  A 2 B 3 S

Alocação de memória PtA PtB PtS A 2 B 3 S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS  A 2 B 3 S

Alocação de memória PtA PtB PtS A 2 B 3 S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS  A 2 B 3 S

Alocação de memória PtA PtB PtS A 2 B 3 S program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS  A 2 B 3 S

Alocação de memória PtA PtB PtS A 2 B 3 S 5 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS  A 2 B 3 S 5

Alocação de memória 5 PtA PtB PtS A 2 B 3 S 5 program soma; var S,A,B: integer; PtS,PtA,PtB: ^integer; begin A := 2; B := 3; PtA := @A; PtB := @B; PtS := @S; PtS^ := PtA^ + PtB^; Writeln('Resultado: ',PtS^); end. PtA PtB PtS A 2 B 3 S 5

procedure New( ) Cria dinamicamente (em tempo de execução) uma nova variável e faz uma variável ponteiro apontar para ela. type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.

Alocação de memória type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end.  P

Alocação de memória type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. P 

Alocação de memória type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. P  Bom Dia!

Alocação de memória Bom Dia! type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. P  Bom Dia!

OBS: a procedure Dispose libera uma variável criada Alocação de memória type Str18 = string[18]; var P: ^Str18; begin New(P); P^ := 'Bom dia!'; Writeln (P^) Dispose(P); end. P OBS: a procedure Dispose libera uma variável criada dinamicamente. Se isso não for feito, a região de memória disponibilizada não poderá ser usada até que o computador seja reiniciado.

Outras situações comuns Um ponteiro recebendo o endereço de um outro: var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^); { ou q^ ou, ainda, r^ } dispose(q^); { ou p^ ou, ainda, r^ } :

Alocação de memória : p q r var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } :  p q r

Alocação de memória : p q r var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } :  p q r

Alocação de memória : p q r 5 var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } :  p q r 5

Alocação de memória : p q r 5 var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } : p q r  5

Alocação de memória : p q r 5 var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } : p q r  5

Alocação de memória : p q r 5 var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } : p q r  5

Alocação de memória 5 : p q r 5 var p,q,r: ^integer; begin new(p); new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } : p q r  5

Portanto, o manuseio de ponteiros Alocação de memória ATENÇÃO: observe que a partir de q:=p;, perdeu-se o acesso à variável criada com new(q); Portanto, o manuseio de ponteiros exige cuidado! var p,q,r: ^integer; begin new(p); p^ := 5; new(q); q:= p; r := p; {ou q} writeln(p^);{ou q^ ou r^ } dispose(q^);{ou p^ ou r^ } : p q r 

Listas encadeadas Em várias situações em programação temos que lidar com listas de elementos cujo tamanho exato é desconhecido. Soluções: Empregar um agregado homogêneo (array) superdimensionado. 1 2 3 ... N-1 N Empregar seqüências de células (nós) que contêm dois elementos: um valor e um ponteiro para o próximo nó. ... p /

Quando adotar uma ou outra solução? Agregado homogêneo: quando pudermos determinar com segurança o tamanho máximo. Listas encadeada: - quando for difícil estimar o tamanho máximo com segurança; e/ou... - quando se desejar maior agilidade nas inclusões ou exclusões de novos elementos.

Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. OBS: o ponteiro contido no primeiro nó aponta para a lista formada pelos demais nós p / 4 7 1 9 Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil)

Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. OBS: para se ter acesso aos elementos da lista é necessário que haja sempre uma variável ponteiro apontando para a “cabeça” da lista (primeiro elemento) p / 4 7 1 9 Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil)

Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. A partir de cada nó, pode-se ter acesso ao seguinte. Assim, pode-se percorrer a lista toda. p / 4 7 1 9 Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil)

Lista: uma estrutura recursiva: Ex: definição de uma lista de inteiros: Lista vazia; Um inteiro seguido de uma lista de inteiros. Quando a lista estiver vazia o ponteiro que deveria apontar o primeiro elemento, guarda o valor nil ( / ). p / 4 7 1 9 Lista vazia Lista com quatro elementos (o último quarda o ponteiro nil)

Definição (recursiva) de um nó: OBS: no início da execução do programa só há ponteiros (p,q) para nós. Estes poderão, dinamicamente, ser empregados para se construir uma lista. Definição (recursiva) de um nó: type tDado = integer; { ou real, char, etc.} tPtNo = ^tNo; tNo = record Dado:tDado; Prox :tPtNo; end; var p,q: tPtNo;

p^.Dado Exemplo de uso: criação de uma lista com dois elementos: var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p^.Dado acesso ao objeto apontado por p campo específico

p^.Prox Exemplo de uso: criação de uma lista com dois elementos: var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p^.Prox acesso ao objeto apontado por p campo específico

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :  p q

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :  p q

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; :  p q 7

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p q  7

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p q  7 3

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p q  7 3

Alocação de memória var p,q: tPtNo; begin new(p); p^.Dado := 7; new(q); q^.Dado := 3; p^.Prox := q; q^.Prox := nil; : p q 7 3 / 

Exemplo 2: dada a lista abaixo, inserir um novo nó entre os dois existentes e armazenar nele o valor 2. : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; p q 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil;  p q 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil;  p q 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil;  p q 2 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; p q  2 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; p q  2 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; p q /  2 7 3 /

Alocação de memória : new(q); q^.Dado := 2; q^.Prox := p^.Prox; p^.Prox := q; q := nil; p q /  7 2 3 /

Manuseio de listas encadeadas Para tratar de forma genérica todas as possíveis manipulações de uma lista encadeada, é definido um conjunto de rotinas. Exemplos: inserir/excluir um elemento no início inserir /excluir um elemento no final inserir /excluir um elemento na enésima posição calcular a soma dos elementos

Exemplo: inserir elemento V no final Duas situações a se considerar: Lista vazia Lista com 1 ou mais elementos p p / ... /

Para lista vazia: p / : new(p); p^.Dado:=V; p^.Prox:=nil;

Alocação de memória : new(p); p^.Dado:=V; p^.Prox:=nil; V 5  p

Alocação de memória : new(p); p^.Dado:=V; p^.Prox:=nil; V 5  p

Alocação de memória : new(p); p^.Dado:=V; p^.Prox:=nil; V 5 p  5

Alocação de memória : new(p); p^.Dado:=V; p^.Prox:=nil; V 5 p  5 /

Para lista não vazia: p 4 7 1 / : { fazer q apontar para o último elemento } q:= p; while q^.Prox <> nil do q:=q^.Prox; { inserir o novo elemento } new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r;

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5  p q r 7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5 p q r  7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5 p q r  7 2 3 /

Alocação de memória : V 5 p q r 7 2 3 5 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5 p q r  7 2 3 / 5

Alocação de memória : V 5 p q r 7 2 3 5 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5 p q r  7 2 3 / 5 /

Alocação de memória : V 5 p q r 7 2 3 5 q:= p; while q^.Prox <> nil do q:=q^.Prox; new(r); r^.Dado:=V; r^.Prox:=nil; q^.Prox:=r; V 5 p q r  7 2 3 5 /

Juntando as duas situações... Como existe a possibilidade de p mudar seu conteúdo, ele é passado por referência. procedure InsereNo(var p: tPtNo; V : tDado); var q,r: tPtNo; begin new(r); r^.Dado:=V; r^.Prox:=nil; if p = nil then p:= r else begin q:= p; while q^.Prox <> nil do q:=q^.Prox; q^.Prox:=r; end;