Ir ao conteúdo
  • Cadastre-se

Problema em lista duplamente encadeada em pascal


Visitante

Posts recomendados

Estou fazendo um trabalho de lista duplamente encadeada, que tem que adicionar um elemento no inicio, meio e fim e também excluir no inicio, meio e fim no pascalzim, de alocação dinâmica.

O que conseguir fazer foi somente adicionar e excluir no inicio, já tentei de tudo que sei pra adicionar e excluir nas outras posições e sempre da erro, me ajudem a concluir..

Segue abaixo o que já conseguir fazer.

Program lista;
uses crt;
type
  elo=^no;
    no=record
        nome: string;
        prox: elo;
    end;
var prim,p, aux: elo;
        op:integer;
    a:boolean;
    procurado:string;
Begin
    op:=1;
    while op<>0 do
    begin
    clrscr;
    op:=0;
    writeln (' -----------------------');
    writeln ('|      Menu Lista        |');     
        writeln (' -----------------------');
    writeln ('|                       |');
    writeln('|    1-Inicializar      |');
    writeln('|    2-Inserir Inicio   |');
    writeln('|    3-Inserir Meio     |');
    writeln('|    4-Inserir Fim      |');
    writeln('|    5-Excluir Inicio   |');
    writeln('|    6-Excluir Meio     |');
    writeln('|    7-Excluir Fim      |');
    writeln('|    8-Procurar         |');
    writeln('|    9-Exibir           |');
    writeln('|    0-Sair             |');
    writeln (' -----------------------');
    write('  Escolha uma opcao: ');
    readln(op);
    writeln;
    
    if op>9 then
    begin
        write ('Opção invalida');
        readkey;
        end;
        
        if op<0 then
    begin
        write ('Opção invalida');
        readkey;
        end;
        
    if op=1 then
    begin
        clrscr;
        new(prim);
        prim^.prox:=NIL;
        writeln('Lista inicializada');
        readkey;
    end;
    
    if op=2 then
    begin
        clrscr;
        new(p);
        writeln('Digite o nome para ser inserido no inicio da lista: ');
        readln(p^.nome);
        p^.prox:=prim;
        prim:=p;
        end;
    
    
    if op=5 then
        begin
        clrscr;
        writeln('Digite o nome a ser excluido no inicio: ');
        readln(procurado);
        p:=prim;
        a:=true;
        while (p<>NIL) and a do 
        begin
            if p^.nome=procurado then
            begin
                aux:=p^.prox;
                p^.nome:=aux^.nome;
                p^.prox:=aux^.prox;
                a:=false;
            end;
            if p^.nome<>procurado then
            begin
                p:=p^.prox;
            end;
        end;
        writeln('   ');
        if a=false then writeln('O nome ', procurado ,' foi excluido na Lista!')
        else writeln('O nome ', procurado ,' não existe na Lista!');
        readkey;
    end;
    
    if op=8 then
    begin
        clrscr;
        writeln('Digite o nome a ser procurado:');
        readln(procurado);
        p:=prim;
        a:=true;
        while (p<>NIL) and a do 
        begin
            if p^.nome=procurado then
                a:=false
            else
                p:=p^.prox
        end;
        writeln;
        if a=false then writeln('O nome ', procurado ,' foi encontrado na Lista!')
        else writeln('O nome ', procurado ,' não foi encontrado na Lista!');
    readkey;
        end;
    
    if op=9 then
    begin
        clrscr;
        p:=prim;
        if p=nil then
         write ('Lista Vazia')
        else
        while p<>NIL do
        begin
            writeln(p^.nome);
            p:=p^.prox;
        end;
     readkey;   
    end;
    end;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Luiz_Phellipe.

 

- Nesses if que estão selecionado a opção que o usuário escolheu de acordo com o Menu, você deve utilizar if/else, pois são opções mutuamente exclusivas entre si, ou seja, se for uma opção, não pode ser outra. (sem o else, continuará verificando um por um mesmo que uma opção já tenha sido escolhida)

Como são if simples e com números, você poderia usar Case;

 

- A opção de verificação de "opção inválida" pode ser feita em um if só! Algo como if (op>9) or (op<0) then;

 

- Antes de incluir, excluir e pesquisar, também é necessário verificar se a lista foi "iniciada" ou se "está vazia";

 

- Se é para remover um elemento "no inicio, meio ou fim", você não precisa do nome a ser procurado. Simplesmente irá remover um do início, ou do meio ou do fim. Se é no início, exclui o primeiro, se no fim o último, se no meio, ai que que definir melhor o que é "meio"...;

 

- Da mesma forma que para criar é necessário dar um new(), ao remover é necessário dar um dispose() no "elo", para liberar a memória... Se não remover, ele continuará existindo, apenas não terá uma referência. (esses elos consomem memória na execução do programa, e no mínimo pode ser considerado um erro de lógica).


Por enquanto acho isso

No aguardo.

 

 

Link para o comentário
Compartilhar em outros sites

Valeu cara me ajudou um pouco..

Mas queria saber qual o processo que se faz pra poder adicionar e remover no meio e fim, já conseguir fazer pra adicionar e remover no inicio..

Se possivel por favor 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O processo para excluir no fim ou em qualquer outro lugar é análogo a excluir no início... basta você localizar o elo que que excluir.

 

Como pode fazer para chegar na última posição? Cheque lá e exclua.

Como faço para chegar no meio? Primeiro você tem que definir o que é "meio". Após cheque lá, e exclua.

 

Veja, você ainda precisa verificar o que citei na postagem anterior, o que inclui a questão que você não precisa "procurar valores", mas sim posição. Se é para excluir o primeiro, exclua o primeiro. E a questão que é necessário liberar com o dispose() também.

 

Minha sugestão é que corrija primeiro seu código atual... depois parte para excluir no fim.

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!