Quando o enunciado diz lista duplamente encadeada circular com cabeça, o circular significa que a última célula da lista aponta para cabeça, ou aponta para cabeça->prox?
Então, também estou com essa dúvida. Não sei a lista pode ser representada assim:
CABEÇA <-> X <-> ........ <-> CABEÇA
ou
CABEÇA <-> X <-> ........ <-> X
EDITADO: Tenho quase certeza que é a primeira opção, por conta da definição de lista circular: "a última célula aponta para a primeira". Como numa lista com cabeça a primeira célula é a cabeça, então deve ser o primeiro esquema.
Edit[2]: parando pra pensar, o segundo esquema é igual o primeiro hahaha
Então João, tbm tinha pensado nesses dois possíveis jeitos. Acho que de fato o primeiro é o mais ideal. Mas fico na dúvida se seria
CABEÇA <-> X <-> .... <-> X.
Ou seria
CABEÇA <-> X <-> ... <-> CABEÇA?
Pq a cabeça é santificada né?! Não pode ser tocada.
Como vc disse realmente é a mesma coisa, mas isso muda como vou fazer a condição de parada no while para as funções que mostram a lista, pq em um caso seria quando fosse novamente a CABEÇA e no outro seria quando fosse X novamente né?
Meus argumentos:
1- Por definição, a cabeça é a primeira célula de uma lista, ainda que a única informação útil dela é o endereço da próxima célula (nessa caso, da próxima e da anterior);
2- Em uma lista circular (duplamente encadeada ou não), por definição, a última célula aponta para a primeira;
Conclusão: se a primeira célula é a cabeça e numa lista circular, a última célula aponta para a primeira, então a ultimacelula->prox=cabeca.
Quanto à condição de parada, não faria exatamente muita diferença: ao invés de parar, por exemplo, na célula cabeca, pararia em cabeca->prox, e depois você liberaria a cabeça à parte. Pelo menos eu acho.
Justo!! XD
Segundo nossa amada wikipedia:
- Lista duplamente encadeada circular: Neste modelo de lista possuimos apenas um sentinela. Esta lista é conhecida como circular pois o sentinela aponta para o primeiro elemento da lista e o último elemento da lista aponta para o sentinela, formando assim um círculo lógico.
o que me leva a concluir que:
último <-> cabeça <-> primeiro
http://www.brpreiss.com/books/opus5/html/page165.html
A imagem c representa o que seria a nossa lista.
Nesse caso, nossa sentinela seria o lst->cab ?
Então a cabeça aponta para a primeira, digamos, "célula efetiva" da lista? E essa "célula efetiva" aponta para a última célula?
suponho que, neste caso, seria
cabeça -> celula efetiva -> cabeça
E aí pessoal? Tenho a mesma dúvida...
No código temos
lst->cab->ant = lst->cab->prox = lst->cab;
Quando cria a cabeça, ou seja:
cabeça <-> cabeça <-> cabeça
Então pode-se concluir que ao inserir elemento1 temos:
... <-> elemento1 <-> cabeça <-> elemento1 <-> ...
Incluindo a cabeça na lista circular... Portanto o último estará ligado na cabeça e a cabeça estará ligada no último.
Eu entendi que era para ser feito assim também.