Jump to content

Erro estranho numa lista dinâmica


ironmagician
 Share

Recommended Posts

Olá, é a primeira vez que posto.

Estou a estudar Pascal, e decidi criar uma lista dinâmica com ponteiros, só que não está a funcionar devidamente. Espero que alguma alma caridosa o reveja 😁 . O objectivo da lista é inserir dados, adicionar e apagar nós e mover pela lista, mas quando tento criar um novo nó com a tecla "A" ou "D" dá um erro a segunda vez que crio, à primeira cria normalmente o no, mas à segunda criação de nó o primeiro nó desaparece e ao mudar de nó com as teclas "Z" e "C" faz um loop entre os dois nós criados em último lugar. (Penso que o problema está na parte de if men="A" e if men="D", na criação de novos nós)

Agradeço desde já a ajuda.

program listadinamica;
uses crt;

type

  pont=^lista;
  lista=record
       ant:pont;
       nome,turma:string;
       numero:integer;
       dep:pont;
       end;

var b,b2,c:pont;
men:char;
inf,emptyi:integer;
emptys:string;


procedure inst;
begin
clrscr;
Writeln ('Z e C                    --- Mudar de aluno');
Writeln ('M                        --- Mudar o nome');
writeln ('D                        --- Inserir um novo nó depois');
writeln ('A                        --- Inserir um novo nó antes');
writeln ('Q                        --- Apagar nó antes');
writeln ('E                        --- Apagar nó depois');
writeln ('P                        --- Para o programa');
readln;
clrscr;
end;

procedure programa;
begin
clrscr;
new(b);
b^.ant := nil;
b^.dep := nil;

repeat
repeat
clrscr;
Writeln  ('._____________________________________.');
writeln  ('|                                     |');
writeln  ('|                                     |');
writeln  ('|                                     |');
writeln  ('|                                     |');
writeln  ('|                                     |');
writeln  ('|                                     |');
writeln  ('|                                     |');
Writeln  ('|_____________________________________|');
gotoxy(2,3);
write ('Nome:');
if b^.nome <> emptys then write (b^.nome);
if b^.nome = emptys  then write ('SEM DADO');

gotoxy(2,5);
write ('Turma:');
if b^.turma <> emptys then write (b^.turma);
if b^.turma = emptys  then write ('SEM DADO');
gotoxy(2,7);
write ('Numero:');
if b^.numero <> emptyi then write (b^.numero);
if b^.numero = emptyi  then write ('SEM DADO');

men:=upcase(readkey);

until men in ['Z','C','P','A','D','Q','E','M','W'];
if men = 'P' then begin clrscr; halt; end;

if men = 'C' then begin
if b^.dep <> nil then begin
b:=b^.dep;
clrscr;
end;
end;

if men = 'Z' then begin
if b^.ant <> nil then begin
b:=b^.ant;
end;
clrscr;
end;

[b]if men = 'A' then begin
new(c);
if b^.ant = nil then begin b^.ant:=c; c^.dep:=b; c^.ant:=nil; end;
if b^.ant <>nil then begin b2:=b^.ant; b2^.dep:=c; b^.ant:=c;
c^.dep:=b; c^.ant:=b2; end;
end;

if men = 'D' then begin
new(c);
if b^.dep = nil then begin b^.dep:=c; c^.ant:=b; c^.dep:=nil; end;
if b^.dep <>nil then begin b2:=b^.dep; b2^.ant:=c; b^.dep:=c;
c^.ant:=b; c^.dep:=b2;  end;
end;[/b]


if men = 'M' then begin
repeat
clrscr;
Writeln ('O que deseja alterar?');
Writeln ('1 - Nome');
Writeln ('2 - Turma');
Writeln ('3 - Numero');
Writeln ('4 - Nada');
men:=readkey;
until men in ['1','2','3','4'];
clrscr;
case men of
'1':begin
Write ('Insira o nome do aluno:');
readln (b^.nome);
end;
'2':begin
Write ('Insira a turma do aluno:');
readln (b^.turma);
end;
'3':begin
Write ('Insira o numero do aluno:');
readln (b^.numero);
end;
end;
clrscr;
end;


if men = 'Q' then begin
if b^.ant <> nil then begin
b2:=b^.ant;
if b2^.ant = nil then begin dispose(b2); b2:=b end;
if b2^.ant <> nil then begin b2:=b2^.ant; c:=b2^.dep;
b2^.dep:=b; b^.ant:= b2; dispose(c); c:=b;
end;
end;
end;


if men = 'E' then begin
if b^.dep <> nil then begin
b2:=b^.dep;
if b2^.dep = nil then begin dispose(b2); b2:=b; end;
if b2^.dep <> nil then begin b2:=b2^.dep; c:=b2^.ant;
b2^.ant:=b; b^.dep:= b2; dispose(c); c:=b;
end;
end;
end;
until inf=89;
end;


begin
clrscr;
inst;
clrscr;
programa;
clrscr;
end.

P.S.:Estou a usar o compilador FreePascal.

Link to comment
Share on other sites

ironmagician, sem colocares as tuas dúvidas de forma clara e precisa ninguém te vai conseguir ajudar.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.