Como exemplo para o conceito
apresentado na postagem anterior (Lista Encadeada), segue um programa simples e
completo que armazena nomes em ordem crescente, abaixo segue a declaração de
como será o nó da lista a ser utilizada, junto do ponteiro que indica o inicio
da lista:
typedef struct tagNode
{
char strName[80];
struct tagNode *next;
} sNode;
sNode *ptrStart;
|
Apesar de ser ideal utilizar
funções como getnode e freenode, utilizando em separado rotinas
de ordenação, é mais simples construir a lista de forma já ordenada, inserindo
cada novo elemento na sequencia apropriada.
INSERIR
A função LListStore recebe o novo nó e o ponteiro com o inicio da lista, a
primeira verificação, é para inicializar a lista caso está esteja vazia com o
novo nó.
if (
*pStart == NULL ) {
*pStart =
pNew;
pNew->next
= NULL;
}
|
A próxima parte consiste em
percorrer a lista comparando o nome do novo elemento, com o que está
armazenado, temos um nó pInfo para a
posição atual e outro nó pPrior para
a posição anterior. Enquanto pInfo apontar para um elemento valido,
avança para o próximo nó.
sNode *pInfo = *pStart;
sNode *pPrior =
NULL;
while( pInfo )
{
if ( strcmp( pNew->strName, pInfo->strName )
> 0 )
{
pPrior
= pInfo;
pInfo = pInfo->next;
}
}
|
Para o caso aonde o novo elemento
será o novo inicio da lista, significa que pPrior
ainda é nulo, atualizamos o endereço seguinte do novo elemento e direciona-se o
ponteiro pStart para o novo nó.
if ( pPrior
== NULL) {
pNew->next = pInfo;
*pStart =
pNew;
}
|
Se ponteiro pPrior não for nulo, significa inserção entre dois elementos,
atualiza o endereço do ponteiro pPrior
para o novo nó e novo nó aponta para o elemento atual da lista.
if ( pPrior
) {
pPrior->next
= pNew;
pNew->next = pInfo;
}
|
Ao terminar de percorrer toda
lista sem ter encontrado uma posição, significa incluir no fim da lista,
portanto o ponteiro anterior pPrior
aponta para o novo nó e que passa indicar fim de lista com nulo no campo de
endereço seguinte.
pPrior->next = pNew;
pNew->next =
NULL;
|
EXCLUIR
Para o processo de exclusão a
rotina LListDelete recebe o como
entrada cuja ocorrência na lista deverá ser excluída, junto do inicio da lista,
repetindo a forma de percorrer a lista como visto acima, as posições são
controladas por pInfo para atual e pPrior para anterior.
Sendo o nó pPrior nulo, significa
excluir o primeiro elemento, basta atualizar o ponteiro pStart que indica o inicio da fila para o seguinte.
if ( pPrior
== NULL )
*pStart =
pInfo->next;
|
Para as demais situações do
processo de exclusão, basta copiar o valor do endereço do próximo nó do
elemento a ser excluído para o nó anterior.
if ( pPrior
)
pPrior->next
= pInfo->next;
|
Copiar o valor de next simplifica o processo, pois o mesmo
já está inicializado com o valor do próximo nó ou indicação de nulo.
Observe que a busca do nó deveria
ser feito em separado da rotina para excluir o nó, entretanto por se tratar de
uma lista singularmente encadeada, o processo de exclusão necessita do endereço
do nó a ser excluído, junto do nó anterior, o que aumentaria também a complexidade
do processo de busca do que deveria ser um simples exemplo, a modularidade
desejada será atendida quando for apresentado o conceito de lista duplamente
encadeada que irá incorporar o endereço anterior à estrutura do nó.
Os processos para alocar e
liberar a memória usada na lista foi realizado fora de LListStore e LListDelete
para manter as mesmas compactas e enfatizar somente o processo de controle de
apontamento, as rotinas responsáveis por isto são Insert e Delete, fazem parte
do menu com as opções de operação em lista, o programa completo segue abaixo.
A execução resulta na seguinte tela, aonde se pode escolher a ação digitando o numero entre parênteses.
Inserir ( 1 )
Apagar ( 2 )
Listar ( 3 )
Sair ( 0 )
Escolha umas das alternativas anteriores :
|
Após selecionar ‘1’
para iniciar a entrada de nome para a lista e realizar a inclusão dos nomes, o usuário
deve confirmar o campo nome estando vazio,
para encerrar o processo de inserir.
Escolha umas das alternativas anteriores : 1
Digite o nome : roberto
Digite o nome : vanusa
Digite o nome : mariana
Digite o nome : laura
Digite o nome : bianca
Digite o nome :
Inserir ( 1 )
Apagar ( 2 )
Listar ( 3 )
Sair ( 0 )
Escolha umas das alternativas anteriores :
|
Digite ‘2’ para selecionar a opção de apagar um nome na lista, após a
entrada do nome, o item será excluído caso seja encontrado, do contrario,
informa que não foi possível encontrar o item.
Escolha umas das alternativas anteriores : 2
Digite o nome que deseja excluir da lista : mariana
Item removido
Inserir ( 1 )
Apagar ( 2 )
Listar ( 3 )
Sair ( 0 )
Escolha umas das alternativas anteriores : 2
Digite o nome que deseja excluir da lista : mari
Nao encontrado
|
A terceira opção de listar os
nomes, apresenta os nomes em ordem crescente junto das informações de endereço
na memória, como o endereço do nó, mais o ponteiro para o próximo nó.
Name : bianca
Address : 004F1458
Next : 004F13D8
Name : laura
Address : 004F13D8
Next : 004F1258
Name : roberto
Address : 004F1258
Next : 004F12D8
Name : vanusa
Address : 004F12D8
Next : 00000000
|
Parabéns pela iniciativa, mas ainda tenho algumas dúvidas rsrs.
ResponderExcluirObrigado pela contribuição.