Ir ao conteúdo
  • Cadastre-se
Luiz_Phellipe

Problema em lista duplamente encadeada em pascal

Recommended Posts

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

 

Compartilhar este post


Link para o post
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 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×