program cpfs; type TCPF = ^ptcpf; ptcpf = record cpf : string; prox : TCPF; end; THash = array[0..99] of ^ptcpf; var cpf:string; bool:boolean; hash:thash; function charInt(var letra:char):integer; var tmp:integer; begin tmp:=Ord(letra)- Ord('0'); charInt:=tmp; //ord('0')=48... ord('1')=49... dai -48 vira 0... end; function validacaoDeInexistencialismoDeOutroCadastroDePessoasFisicaDentroDaLista( var cpf:string; final:integer; var cpfs:thash ): boolean; var i:integer; aux:^ptcpf; existenciaDeTalInformacaoNaLista:boolean; begin aux := cpfs[final]; existenciaDeTalInformacaoNaLista := false; while (aux^.prox <> nil) and (not existenciaDeTalInformacaoNaLista) do begin if (cpf = aux^.cpf) then existenciaDeTalInformacaoNaLista := true else aux:= aux^.prox; end; validacaoDeInexistencialismoDeOutroCadastroDePessoasFisicaDentroDaLista := existenciaDeTalInformacaoNaLista; end; function validarCPF(var cpf:string):boolean; var i, soma, dig1, dig2:integer; begin soma:=0; for i:=1 to 9 do // *11-i, vai decrementando, *9, *8, *7... soma:=soma+( charInt(cpf[i]) ) * (11-i); dig1 := 11 - (soma mod 11); if (dig1 = 10) or (dig1 = 11) then dig1 := 0; soma := 0; for i := 1 to 10 do soma := soma + (Ord(cpf[i])-48)*(12-i); dig2 := 11 - (soma mod 11); if (dig2 = 10) or (dig2 = 11) then dig2 := 0; ValidarCPF := (dig1=charInt( cpf[10] )) and (dig2 = charInt( cpf[11] )); end; procedure inserirCPF(var cpfs:THash; var cpf:string); var i, doisDigitos:integer; novo, atual, ant:TCPF; begin if validarCPF(cpf) then begin doisDigitos:=( charInt(cpf[10])*10 ) + charInt(cpf[11]); //*10 pq né, vira dezena + decimal 👍 if (not validacaoDeInexistencialismoDeOutroCadastroDePessoasFisicaDentroDaLista(cpf, doisDigitos, cpfs)) then begin new(novo); if novo = nil then writeln('Memoria cheia') else begin novo^.cpf := cpf; novo^.prox := nil; atual:= cpfs[doisDigitos]; ant:=nil; while (atual <> nil) and (atual^.cpf < cpf) do begin ant := atual; atual := atual^.prox; end; if ant = nil then begin novo^.prox := cpfs[doisDigitos]; cpfs[doisDigitos] := novo; end else begin novo^.prox := atual; ant^.prox := novo; end; end; end ; end else writeln('CPF INVALIDO'); end; procedure escrever(var cpfs:thash); var i:integer; aux:^ptcpf; begin for i:= 0 to 99 do begin writeln('Digito final', i); aux := cpfs[i]; while (aux <> nil) do begin writeln(aux^.cpf); aux:= aux^.prox end; end; end; procedure buscar(final:integer); var aux:^ptcpf; achou:boolean; valor:string; begin achou:=false; valor:= 'Nao achou'; aux := cpfs[final]; while (aux <> nil) and (not achou) do begin if(aux.cpf = cpf) then begin achou:=true; valor:=(aux^.cpf) ; end; end; writeln(valor); end; procedure remover() ; var begin end; begin readln(cpf); inserirCPF(hash, cpf); escrever(hash); end.