{***********************************************} { Descricao dos tipos de dados } Type TListaSE_Dado = Integer; Ptr_ListaSE_Nodo = ^ListaSE_Nodo; ListaSE_Nodo = Record Dado: TListaSE_Dado; Prox : Ptr_ListaSE_Nodo; End; {***********************************************} { Descricao das Rotinas } Procedure ListaSE_Inicializa (Var LSE: Ptr_ListaSE_Nodo); { LSE = Ponteiro para o inicio da Lista Simplesmente Encadeada, inicializa com NIL } Begin LSE := NIL; End; Procedure ListaSE_Insere_Inicio (Var LSE: Ptr_ListaSE_Nodo; Dado: TListaSE_Dado); { Insere um dado no inicio da lista, ou seja, como primeiro da lista } Var novo: Ptr_ListaSE_Nodo; Begin New (novo); novo^.Dado := Dado; novo^.Prox := LSE; LSE := novo; End; Procedure ListaSE_Insere_Final (Var LSE: Ptr_ListaSE_Nodo; Dado: TListaSE_Dado); { Insere um dado no final da lista, ou seja, como ultimo da lista } Var novo, aux: Ptr_ListaSE_Nodo; Begin New (novo); novo^.Dado := Dado; novo^.Prox := NIL; If LSE = NIL Then LSE := novo { Lista vazia ? Insere 1o. nodo } Else Begin aux := LSE; While aux^.Prox <> NIL { Avanca ate o ultimo nodo } Do aux := aux^.Prox; aux^.Prox := novo; End; End; Procedure ListaSE_Insere_Ordenado (Var LSE: Ptr_ListaSE_Nodo; Dado: TListaSE_Dado); { Insere os dados de modo ordenado, localizando a sua correta posicao na lista ordenada } Var novo, aux, ant: Ptr_ListaSE_Nodo; Begin New (novo); novo^.Dado := Dado; aux := LSE; While (aux <> NIL) AND (aux^.Dado < Dado) Do Begin ant := aux; aux := aux^.Prox; End; If aux = LSE Then LSE := novo { Lista vazia ? } Else ant^.Prox := novo; novo^.prox := aux; End; Function ListaSE_Remove_Inicio (Var LSE: Ptr_ListaSE_Nodo; Var Dado: TListaSE_Dado): Boolean; { Remove o primeiro dado da lista } Var aux: Ptr_ListaSE_Nodo; Begin aux := LSE; If aux = NIL Then ListaSE_Remove_Inicio := False Else Begin Dado := LSE^.Dado; LSE := LSE^.Prox; Dispose (aux); ListaSE_Remove_Inicio := True; End; End; Function ListaSE_Remove_Final (Var LSE: Ptr_ListaSE_Nodo; Var Dado: TListaSE_Dado): Boolean; { Remove o ultimo dado da lista } Var aux: Ptr_ListaSE_Nodo; Begin aux := LSE; If aux = NIL Then ListaSE_Remove_Final := False Else Begin if aux = NIL { Lista vazia ? } Then ListaSE_Remove_Final := False Else Begin If aux^.Prox = NIL Then Begin LSE := NIL; Dado := aux^.Dado; Dispose (aux); End Else Begin While aux^.Prox^.Prox <> NIL { Localiza o penultimo nodo } Do aux := aux^.Prox; Dado := aux^.Prox^.Dado; Dispose (aux^.Prox); aux^.Prox := NIL; End; ListaSE_Remove_Final := True; End; End; End; Procedure ListaSE_Exibe (LSE: Ptr_ListaSE_Nodo); { Exibe na tela o conteudo da lista encadeada } Var aux: Ptr_ListaSE_Nodo; Begin aux := LSE; While aux <> NIL Do Begin Writeln (aux^.Dado); aux := aux^.prox; End; Write ('Tecle para continuar...'); Readln; { Faz uma pausa... } End; Procedure ListaSE_Grava (Var ArqTxt:Text; LSE: Ptr_ListaSE_Nodo); { Grava em disco o conteudo da lista encadeada } Var aux: Ptr_ListaSE_Nodo; Begin aux := LSE; While aux <> NIL Do Begin Writeln (ArqTxt,aux^.Dado); aux := aux^.prox; End; End; Procedure ListaSE_Le (Var ArqTxt:Text; Var LSE: Ptr_ListaSE_Nodo); { Le do disco o conteudo da lista encadeada } Var aux : Ptr_ListaSE_Nodo; dado: TListaSE_Dado; Begin While not Eof(ArqTxt) Do Begin readln (ArqTxt,dado); ListaSE_Insere_Final(LSE,dado); End; End;