{----- inicio da procedure insere -----} procedure insere (var arvorebinariaordenada: ponteiroarvorebinaria; var listafuncionarios: ponteiroarvorebinaria; nomedigitado: string; numeroidentificacaodigitado: integer; departamentodigitado: string; salariodigitado: real); var novo, ponteiro, anterior, auxiliar: ponteiroarvorebinaria; achou: boolean; begin new(novo); novo^.nome := nomedigitado; novo^.numerodeidentificacao := numeroidentificacaodigitado; if (departamentodigitado = 'adm') then novo^.departamento := 'administrativo'; if (departamentodigitado = 'ped') then novo^.departamento := 'pesquisa-e-desenvolvimento'; if (departamentodigitado = 'prod') then novo^.departamento := 'producao'; novo^.salario := salariodigitado; novo^.arvoreesquerda := nil; novo^.arvoredireita := nil; novo^.anteriordupla := nil; novo^.proximadupla := nil; ponteiro := arvorebinariaordenada; while (ponteiro <> nil) do begin anterior := ponteiro; if (numeroidentificacaodigitado > ponteiro^.numerodeidentificacao) then ponteiro := ponteiro^.arvoredireita else ponteiro := ponteiro^.arvoreesquerda; end; if (ponteiro = arvorebinariaordenada) then begin novo^.pai := nil; arvorebinariaordenada := novo; end else begin novo^.pai := anterior; if (numeroidentificacaodigitado > anterior^.numerodeidentificacao) then anterior^.arvoredireita := novo else anterior^.arvoreesquerda := novo; end; auxiliar := listafuncionarios; if (listafuncionarios = nil) then {a lista esta vazia} begin listafuncionarios := novo; novo^.proximadupla := nil; novo^.anteriordupla := nil; end else begin if (upcase(novo^.nome) < upcase(auxiliar^.nome)) then {1ยบ elemento} begin novo^.proximadupla := auxiliar; novo^.anteriordupla := nil; auxiliar^.anteriordupla := novo; listafuncionarios := novo; end else {muitos elementos} begin ponteiro := auxiliar; auxiliar := auxiliar^.proximadupla; while ((auxiliar <> nil) and (not achou)) do begin if (upcase(novo^.nome) < upcase(auxiliar^.nome)) then begin novo^.proximadupla := auxiliar; novo^.anteriordupla := auxiliar^.anteriordupla; auxiliar^.anteriordupla^.proximadupla := novo; auxiliar^.anteriordupla := novo; achou := true; end else begin ponteiro := auxiliar; auxiliar := auxiliar^.proximadupla; end; end; if (not achou) then begin if (upcase(novo^.nome) < upcase(ponteiro^.nome)) then {testar sem} begin novo^.proximadupla := ponteiro; novo^.anteriordupla := ponteiro^.anteriordupla; ponteiro^.anteriordupla^.proximadupla := novo; ponteiro^.anteriordupla := novo; end else begin novo^.proximadupla := nil; novo^.anteriordupla := ponteiro; ponteiro^.proximadupla := novo; end; end; end; end; end; {----- fim da procedure insere -----} {----- inicio da procedure de listar na ordem crescente -----} procedure listacrescente (listafuncionarios: ponteiroarvorebinaria ;l1,l2:char); var listador: ponteiroarvorebinaria; achou: boolean; begin listador := listafuncionarios; while ((listador <> nil) and (not achou)) do begin if ((upcase(listador^.nome) >= upcase(l1)) and (upcase(listador^.nome) <= upcase(l2))) then writeln(listador^.nome); if (upcase(listador^.nome) > upcase(l2)) then achou := true; listador := listador^.proximadupla; end; end; {----- fim da procedure de listar na ordem crescente -----} {----- inicio da procedure de listar na ordem decrescente -----} procedure listadecrescente (listafuncionarios: ponteiroarvorebinaria ;l1,l2:char); var listador: ponteiroarvorebinaria; achou: boolean; begin listador := listafuncionarios; while (listador^.proximadupla <> nil) do begin listador := listador^.proximadupla; end; achou:=false; while ((listador <> nil) and (not achou)) do begin if ((upcase(listador^.nome) >= upcase(l1)) and (upcase(listador^.nome) <= upcase(l2))) then writeln(listador^.nome); if (upcase(listador^.nome) < upcase(l1)) then achou := true; listador := listador^.anteriordupla; end; end; {----- fim da procedure de listar na ordem decrescente -----}