Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Manuel Barreto

Impressão de Lista Encadeada

Recommended Posts

Boa noite, esto fazendo um trabalho e esto em dúvida de como 'imprimir a lista'. Vou mandar o código, se alguém puder me ajudar agradeço.



uses crt;

type
PTNo = ^TNo;
TNo = record
dado:integer;
prox:PTNo;
end;

procedure inicializa(var cabeca:PTNo);
begin
cabeca := nil;
end;

procedure inserir(var cabeca:PTNo; dado:integer);
var novo,pAux:PTNo;
begin
//Crio o novo NO (caixa) da lista
novo := new(PTNo);
novo^.dado := dado;
novo^.prox := nil;

//Se a lista estiver vazia atualiza a cabeca
if (cabeca = nil) then begin
cabeca := novo;
end else begin
//Localizar o último elemento (parar no último elemento)
pAux := cabeca;
while (pAux^.prox <> nil) do begin
pAux := pAux^.prox;
end;
pAux^.prox := novo;
end;
end;

procedure desalocaListaBasic(var cabeca:PTNo);
var pAnt,pProx:PTNo;
begin
pProx := cabeca;
pAnt := cabeca;
while (pProx <> nil) do begin
pProx := pProx^.prox;
dispose(pAnt);
pAnt := pProx;
end;
inicializa(cabeca);
end;

//Dúvida
//Imprimir os dados que tem na lista
procedure imprimirLista(cabeca:PTNo);
begin

end;

procedure desalocaListaAdvanced(var cabeca:PTNo);
begin
if (cabeca <> nil) then begin
desalocaListaAdvanced(cabeca^.prox);
dispose(cabeca);
cabeca := nil;
end;
end;

var lista:PTNo;
begin
inicializa(lista);
inserir(lista,3);
inserir(lista,1);
inserir(lista,2);
desalocaListaAdvanced(lista);
readkey;
end.
program listaEncadeada;

Editado por Simon Viegas
Inserir tag CODE para o código e tag SPOILER para reduzir o tamanho inicial. Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Manuel Barreto.

Boa noite, estou fazendo um trabalho e estou em dúvida de como 'imprimir a lista'.

Como é fácil perceber, a impressão dos dados vai depender da sua estrutura inicial, ou seja, de como os dados estão armazenados.

Então, a primeira coisa que você deve fazer é criar um variável auxiliar para percorrer a lista de nós. Pois você não poderá utilizar a própria variável cabeca, já que ao final do processo você iria perder a posição inicial (valor original do nó cabeca). Tem pelo menos duas formas.

1) Receber o nó como VALOR (em vez de como REFERÊNCIA)

Nesse caso, basta não utilizar o var no parâmetro do procedimento.

Ex.:

[color=#0000ff]procedure[/color] [color=#ff0080]imprimirLista[/color][color=#000000]([/color]NOAtual[color=#000000]:[/color]PTNo[color=#000000]);[/color]

2) Fazer uma cópia do nó

[color=#0000ff]procedure[/color] [color=#ff0080]imprimirLista[/color][color=#000000]([/color][color=#0000ff]var[/color] cabeca[color=#000000]:[/color]PTNo[color=#000000]);[/color]
[color=#0000ff]var[/color]
NOAtual[color=#000000]:[/color]PTNo[color=#000000];[/color]
[color=#0000ff]begin[/color]
NOAtual[color=#000000]:=[/color]cabeca[color=#000000];[/color]

Veja que nesse exemplo você também não precisaria utilizar o VAR, já que o método não tem o objetivo de alterar nada no ponteiro, logo não precisa ter uma "referência", mas sim somente o "valor". Mas usando ou não o resultado vai ser o mesmo, pois ao atualizar a cópia, o Pascal não atualiza o original.

PS: Para testar ambos as versões. Simplesmente mande imprimir duas vezes. Se aparecer duas vezes o resultado, o código está certo.

***

Analisando o código (e como já sugerido acima), é fácil perceber que o primeiro dado está no próprio NO cabeca.

  //Se a lista estiver vazia atualiza a cabeca
if (cabeca = nil) then
cabeca := novo;

E que o último está apontando para NIL.

novo^.prox:= nil;

Daí é só imprimi o nó atual e depois fazer o próprio nó apontar para o próximo, por consequência, enquanto o nó for diferente de NIL.

Como antes de imprimi precisa verificar se existe algum dado já cadastrado, ou faz um if para verificar e se tiver vai imprimindo e atualizando a posição (senão, informa que está vazio) ou usa um while, já que antes de iniciar, já é feito uma verificação.

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×