Adapte a Lista Simplesmente Encadeada desenvolvida em sala de aula (ou
proponha a sua própria) e a transforme em uma Lista Circular. Uma Lista Circular
possui a característica de que o seu último elemento aponta para o primeiro. Adapte
todas as operações necessárias para que tal característica seja mantida
corretamente.
Facilitaria muito se você postasse o que foi desenvolvido em sala de aula, ou pelo menos que linguage estamos falando.
Para responder essa pergunta devemos colocar em prática nosso conhecimento sobre Algoritmo e Estrutura de Dados.
A estrutura utilizada em uma lista circular é do mesmo tipo de uma lista dinâmica encadeada comum, então será utilizada uma estrutura simples com dados em números inteiros.
struct no {
int info;
struct no * prox;
};
typedef struct no *Lista;
Quando um ponteiro deste tipo de lista está vazio ele deve valer "NULL", desta forma para poder inicializar uma lista nova deve-se sempre fazer com que esta seja nula.
void inicializa_lista(Lista *l)
{
*l = NULL;
}
Este tipo de lista facilita a inserção no fim da lista, e deve-se sempre lembrar também que o ponteiro da lista deve apontar para o último elemento da lista, desta forma a operação de inserção fica conforme apresentado pela função a seguir.
int insere_elemento_fim(Lista *l, int elem)
{
Lista aux;
aux = (Lista) malloc(sizeof(struct no));
if (aux == NULL)
return 0;
aux->info = elem;
if(lista_vazia(*l))
{
*l = aux;
(*l)->prox = *l;
return 1;
}
aux->prox = (*l)->prox;
(*l)->prox = aux;
*l = aux;
return 1;
}
Para remover um elemento deve-se verificar se a lista está vazia, pois neste caso não será possível remover nenhum elemento, além disto, deve-se verificar se a lista contém um único elemento, pois neste caso ao remove-lo a lista ficará vazia e deverá ser anulada, caso nenhum dos casos anteriores sejam verdadeiros deve-se fazer com que o último elemento da lista aponte para o segundo elemento e liberar o espeço de memória ocupado por ele. Sendo assim a função remove é apresentada a seguir.
int remove_elemento_inicio(Lista *l)
{
Lista aux;
if(lista_vazia(*l))
return 0;
aux = (*l)->prox;
if(aux->prox == aux)
{
*l = NULL;
free(aux);
return 1;
}
(*l)->prox = aux->prox;
free(aux);
return 1;
}
Portanto, a partir de um código de uma lista encadeada foi adaptada para que ela fosse um código de uma lista circular. Desta forma, o que foi apresentado acima são as principais funções utilizadas neste tipo de lista.
Para responder essa pergunta devemos colocar em prática nosso conhecimento sobre Algoritmo e Estrutura de Dados.
A estrutura utilizada em uma lista circular é do mesmo tipo de uma lista dinâmica encadeada comum, então será utilizada uma estrutura simples com dados em números inteiros.
struct no {
int info;
struct no * prox;
};
typedef struct no *Lista;
Quando um ponteiro deste tipo de lista está vazio ele deve valer "NULL", desta forma para poder inicializar uma lista nova deve-se sempre fazer com que esta seja nula.
void inicializa_lista(Lista *l)
{
*l = NULL;
}
Este tipo de lista facilita a inserção no fim da lista, e deve-se sempre lembrar também que o ponteiro da lista deve apontar para o último elemento da lista, desta forma a operação de inserção fica conforme apresentado pela função a seguir.
int insere_elemento_fim(Lista *l, int elem)
{
Lista aux;
aux = (Lista) malloc(sizeof(struct no));
if (aux == NULL)
return 0;
aux->info = elem;
if(lista_vazia(*l))
{
*l = aux;
(*l)->prox = *l;
return 1;
}
aux->prox = (*l)->prox;
(*l)->prox = aux;
*l = aux;
return 1;
}
Para remover um elemento deve-se verificar se a lista está vazia, pois neste caso não será possível remover nenhum elemento, além disto, deve-se verificar se a lista contém um único elemento, pois neste caso ao remove-lo a lista ficará vazia e deverá ser anulada, caso nenhum dos casos anteriores sejam verdadeiros deve-se fazer com que o último elemento da lista aponte para o segundo elemento e liberar o espeço de memória ocupado por ele. Sendo assim a função remove é apresentada a seguir.
int remove_elemento_inicio(Lista *l)
{
Lista aux;
if(lista_vazia(*l))
return 0;
aux = (*l)->prox;
if(aux->prox == aux)
{
*l = NULL;
free(aux);
return 1;
}
(*l)->prox = aux->prox;
free(aux);
return 1;
}
Portanto, a partir de um código de uma lista encadeada foi adaptada para que ela fosse um código de uma lista circular. Desta forma, o que foi apresentado acima são as principais funções utilizadas neste tipo de lista.
Para escrever sua resposta aqui, entre ou crie uma conta
Compartilhar