Logo Hardware.com.br
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#5 Por jqueiroz
26/05/2006 - 19:12
Não, ela não quer ordenar --- ela quer que a inserção na lista seja feita já em ordem, é diferente.

palominha, você sabe como "costurar" um elemento no meio da lista? É mais ou menos assim:

Vamos supor que você tem uma lista encadeada (simples), onde o nó da lista tem um ponteiro para o próximo elemento, chamado "prox".

Digamos que você tem então um ponteiro chamado "novo", com o novo elemento, e outro chamado "aux" que aponta para o elemento onde você vai costurar o "novo".

Então você tinha sua lista: xxx -> xxx -> xxx -> aux -> yyy -> yyy -> yyy

Depois da costura, você vai ter: xxx -> xxx -> xxx -> aux -> novo -> yyy -> yyy -> yyy

A costura, então, é feita assim:

novo->prox = aux->prox;
aux->prox = novo;


Se você quer então inserir seus elementos de jeito que a lista já seja criada em ordem, basta, a cada inserção, localizar o último elemento que seja menor ao que você quer inserir:

aux = cabeca_lista;
enquanto (aux->prox não é nulo) e (aux->dado < novo->dado), faça:
aux = aux->prox;


Mas veja que agora a gente tem 3 possibilidades: uma, o elemento tem que entrar no meio da lista, e basta você fazer a costura.

Duas, o elemento tem que entrar no fim da lista; mas ainda assim, dá pra você fazer a costura (apesar de que vai costurar um valor nulo, mas tudo bem).

E três, e essa é muito importante, o elemento tem que entrar no início da lista, e nesse caso fica complicado, pois você precisará mexer na cabeça da lista.

Acha que já dá pra codificar alguma coisa???
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
prk_83
prk_83 Super Participante Registrado
370 Mensagens 13 Curtidas
#6 Por prk_83
27/05/2006 - 03:20
jqueiroz
Não, ela não quer ordenar --- ela quer que a inserção na lista seja feita já em ordem, é diferente.


Bom, se precisa listar os elementos após cada inserção, realmente tem q inserir no local certo da lista.

Mas ela tb pode pedir pro usuário digitar tudo.
E no final da digitação, faria uma ordenação pra exibir na ordem correta.

palominha, aí vc vê qual jeito é o q vc precisa.
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#7 Por jackinabox
28/05/2006 - 13:07
Oi!

Pois é como disse o jqueiroz, basicamente você poderia utilizar um ponteiro auxiliar para ir percorrendo a lista elemento por elemento até encontrar a posição em que o novo elemento deve ser inserido (fazendo comparações pelo(s) campo(s) que deve(m) ditar a ordenação, obviamente). Quando você encontrar a posição certa, deve ajustar os ponteiros (o que apontava para lá, agora tem que apontar para cá, e o próximo do de cá deve ser aquele outro...) :mrgreen:

Podemos fazer um exemplo disso uma hora dessas.

Até!
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
palominha
palominha Membro Senior Registrado
246 Mensagens 0 Curtidas
#8 Por palominha
29/05/2006 - 10:30
Caramba que coisa complicada, eu fiz dessa forma

 plista=(Ttabela*)malloc(sizeof(Ttabela));
strcpy(plista->nome,nome);
plista->nAt=nAt;
plista->massa=massa;
plista->prox=NULL;

if (lse_cabeca==NULL)
lse_cabeca=plista;

else
{
plista->prox=lse_cabeca;
lse_cabeca=plista;
}




Não está colocando em ordem alfabética é claro, o que não entendi bem foi pq a necessidade de um terceiro ponteiro (aux)??
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#11 Por jackinabox
29/05/2006 - 12:12
palominha
Também é necessário fazer um for não é, tem que percorrer a lista.

Um while (enquanto). Algo como: enquanto o elemento que você precisa inserir for maior do que o elemento corrente, você deve avançar para o próximo elemento. E o "elemento corrente" obviamente é o elemento que está sendo apontado por um ponteiro auxiliar. E "avançar para o próximo elemento" significa utilizar esse ponteiro auxiliar para apontar para o próximo elemento da lista.
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#12 Por jackinabox
29/05/2006 - 12:31
palominha
Não está colocando em ordem alfabética é claro, o que não entendi bem foi pq a necessidade de um terceiro ponteiro (aux)??


palominha
Não estou entendendo a frase abaixo oops.png
"e outro chamado "aux" que aponta para o elemento onde você vai costurar o "novo".


Vamos ver, na realidade tem ponteiro pra tudo que é lado, mas não é tão complicado assim:

1. Um ponteiro para o início da lista.
2. Um ponteiro em cada nodo da lista, que aponta para o próximo.
3. Um ponteiro que você vai utilizar para percorrer a lista.
4. Um ponteiro que está apontando para o novo nodo a ser inserido.
5. Um ponteiro dentro do novo nodo, que também deverá apontar para o próximo.

Então não é nem "um terceiro ponteiro", pois só aí já tem pelo menos 5.
E você vai precisar utilizar os 5.
Mas tem que pensar em etapas:

* Como vou encontrar a posição em que o novo nodo será inserido?
Aí vou utilizar o ponteiro para o início da lista, e outro ponteiro para percorrer os nodos. E vou ter que fazer comparações do conteúdo dos nodos, é óbvio. E ir avançando para o próximo até encontrar a posição correta.

* Uma vez encontrada a posição correta, quais são os ponteiros que devem ser ajustados?
O ponteiro que está percorrendo a lista está apontando para um nodo "corrente", né? Se vamos inserir um elemento depois do nodo corrente, então: o próximo do novo será o próximo do corrente e o próximo do corrente será o novo. Say what? :mrgreen:
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox
jackinabox Veterano Registrado
1.1K Mensagens 8 Curtidas
#14 Por jackinabox
29/05/2006 - 14:10
palominha
Caramba, é realmente necessário utilizar 5 ponteiros???? oops.png

Como eu comentei, a maioria deles já está lá.

Você precisa utilizar o ponteiro que aponta para o início da lista porque você terá que saber onde a lista começa, para poder percorrê-la. Mas não se trata de utilizaaaaaar. Vai utilizar só para atribuir para um auxiliar que irá percorrer a lista, por exemplo. Mas vai utilizar.

O novo nodo tem um ponteiro dentro dele para o próximo, e o que chamei de "corrente" também tem. Aí já são 3. E assim por diante.

Imagine se a lista fosse duplamente encadeada, daí haveria uns 7 ou 8 que precisariam ser utilizados de alguma forma, hahaha :mrgreen:
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal