Olá pessoal,
Como essa parte do fórum é dedicada para outras linguagens achei que poderia encotrar ajuda aqui para C assim como eu sempre encontro para minhas dúvidas em relação a Java. Então a dificultade é a seguinte:
Eu tenho uma lista circular duplamente encadeada ordenada de strings e desejo realizar a inserção das strings contidas em um arquivo de entrada assumindo o sentido anti-horario, resaltando que a cabeça da lista não mudará em nenhum momento da inserção. A idéia do programa é simples, antes da inserção devo escolher o melhor caminho para a inserção (sentido horario ou anti-horario), isto é, o caminho com menos palavras no caminho. A inserção no sentido horario foi muito simples de implentar, mas a no sentido anti-horário nem tantooo. Como a lista é circular não posso marcar o final dela, pois não sabemos onde ela termina, a única informação sólida é a cabeça da lista, que como já foi dito não será mudada em nenhum momento do programa.
Já tentei varias alternativas, pois reparei que para fazer tal tipo de inserção devemos tratar vários casos, e em alguns deles eu encontro variações que acabam não permitindo a implementação de um padrão para que o programa possa seguir…
Gostaria se possível que alguém me ajudasse a pensar em uma solução para esse probleminha que eu arrumei =)
Desde já agradeço a atenção e a colaboração de todos…
Até…
Pelo que estou vendo, o problema principal é que a cabeça não muda, ela não vai apontar sempre para o menor item da lista.
Não seria melhor encontrar o menor item da lista, usá-la como uma cabeça temporária, e partir daí? Comoa lista é circular, ordenada e dupla, o maior item estará sempre ao lado do menor item.
A cabeça da lista não pode mudar pois antes da inserção é realizado uma pesquisa para escolher o melhor lado para inserção, este será aquele que apresentar menos nós para percorrer…
Mas a questão do maior item sempre estará do lado do menor é verdade… pelo fato dela ser ordenada, mas o detalhe principal é que dependendo da string a inserção é feita depois ou antes do nó analisado.
Já montei diversas expressões, ma sempre aparece uma exceção nova…
Será que alguém poderia me ajudar?
Brigadinhaaa genteee
Como o algoritmo sabe qual é o menor caminho? Ele sai contando por todos os lados?
antes de tudo tem um vetor de frequência, e a indexação dele esta em função do código ASCII do primeiro caracter da string, assim ele incrementa a quantidade de uma determinada letra sempre antes de inserir a string. Assim antes de realizar a inserção ele faz uma varredura no vetor frequência tanto no sentido horário quanto no anti-horário, assim eu comparo os dois valores com isso ele escolhe o tipo da inserção =)
Não enfrento problemas com letras maiusculas e minusculas, pois antes as strings são convertidas para minusculas e elas não podem começar com caracteres especiais, apenas com letras de a-z.
Gostei do método de decisão
Não dá pra pegar esses números da comparação de valores dessa função de decisão, e usá-los para ir p/ a esquerda ou direita n vezes? Ele chegaria perto do ponto de inserção sem precisar comparar os nós cada vez que passar por eles.
Bruno vc quer dizer que eu poderia pular direto para a posição de inserção né?
Mas para isso eu teria q ter a posição de memória, onde está localizado o ponto. E outra se eu não percorrer a lista procurando o ponto de inserção, eu vou perder a caracteristica de uma lista encadeada, que é correr a lista passando por cada nó de uma vez. Pq se eu fosse fazer assim eu poderia guardar em um vetor de ponteiros a posição de começo de cada letra…
Outra os valores do vetor de frequencia são usados para decidir o lado (direita ou esquerda) da inserção, esta parte já está pronta só falta a inserção anti-horaria, a qual eu não consigo fazer um tratamento q abranja todos os casos, sempre aparece uma coisa a mais toda vez q eu penso q tá dando certo ¬¬
Será q vc não tem nenhuma idéia de como eu faço isso?
Vlw \o/
Não disse pular direto p/ o ponto, disse percorrer a cadeia n vezes para um lado, e de lá procurar o ponto de inserção.
Bem, quanto ao programa anti-horário, eu acho estranho ter problemas com ele. Se você já checou todos os casos no horário, o anti-horário é praticamente só inverter as condições, ->próximo vai para ->anterior, >= vira <, >= vira <, assim por diante (== fica == mesmo).
Bem, a gente por ficar dias aqui divagando sobre o algorítmo, mas se você quiser uma resposta mais concreta, acho melhor você postar o programa aqui.
PS: Se no sentido horário funciona, como você tratou a parte quando o ->próximo do maior item aponta pro menor item da lista?
Segue a parte de inserção:
[code]
if(sentidoH < sentidoAH)
{
while(temp->prox != L && !(strcasecmp(temp->prox->nome, nome)>= 0 && strcasecmp(temp->nome, nome) <= 0))
temp = temp->prox;
novo->prox = temp->prox;
temp->prox->ant = novo;
temp->prox = novo;
novo->ant = temp;
}
//sentido anti-horario
else
{
while(temp->ant != L && !strcasecmp(temp->ant->nome, nome)>=0)
temp = temp->ant;
novo->prox = temp;
temp->ant->prox = novo;
novo->ant = temp->ant;
temp->ant = novo;
}
[/code]
Essse foi um dos primeiros códigos que testei…
O problema é a condição de parada para a inserção ¬¬
[code]
//sentido anti-horario
else
{
while(temp->ant != L
&& !(strcasecmp(temp->ant->nome, nome) <= 0 && strcasecmp(temp->nome, nome) >= 0))
temp = temp->ant;
//codigo de inserção p/ anti-horário.
}
[/code]Como disse, é igual ao horario, mas ao contrário. Teste aí.
Não deu não, foi a primeira coisa q eu tentei ¬¬
Agora tô tentando implementar um inserção com tratamento de erro, até que consegui, mas quando mudei os nomes ficou alguns não foram ordenados. Segue abaixo a implementação que estou fazendo ainda em fase de testes, mas já achei alguns probleminhas:
[code]
else
{
while(temp->ant->ant != L && (strcasecmp(temp->nome, nome)<=0))
{
if(strcasecmp(temp->ant->nome, temp->nome)>=0 && strcasecmp(temp->nome, nome)>=0)
{
temp = temp->ant;
break;
}
else
temp = temp->ant;
}[/code]
Vlw