• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dar3_D3vil

[C] Ajuda: Estruturas em anel

19 mensagens neste tópico

Ora boas

Estava eu mto bem a fazer um trabalho kando me deparo com um ciclo infinito nesta funçao

void conta (AP_ANEL actual, int *num){
   AP_ANEL aux;
   
   *num=0;
   aux = actual->prox;
   while(aux != actual){
      aux = aux->prox;
      (*num)++;
   }
}

Sendo aux e actual ambos aneis iguais é imposivel haver ciclos infinitos na funçao infinito (plo menos eu pensava que era impossivel), ainda por cima actual ta vazio,logo:

    actual->prox = actual logo como aux = actual->prox que é = actual nem deveria entrar no whilemetendo o inteiro enviado para a funçao=0.

O estranho é que isto so acontece nesta situaçao se iniciar um anel (este esta vazio e a funçao funciona bem) se inserir dados conta bem, se remover dados e o anel ainda ficar com alguns funciona td bem mas de remover e o anel ficar vazio (como esta kando é iniciado) acontece um ciclo infinito...

Axo isto bue estranho e ja tou ha bue time a tenar resolver isto, se alguem tiver uma ideia para soluçao agredeço a ajuda :thumbsup:

Ja pensei que fosse da funçao remover mas fui confirmar a um programa que o prof deu o codigo e la ta igual a minha...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens a certeza que

actual->prox = actual ?

Só se isto acontecer é que ele não entra no while. Se ele entra..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só com essa função é difícil alguém poder ajudar, a não ser que tenha estado exactamente na mesma situação. Coloca aí o resto do código que trata dos anéis, e já agora usa o geshi quando puseres código :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens a certeza que

actual->prox = actual ?

Só se isto acontecer é que ele não entra no while. Se ele entra..

tenho usei um debugger e la tava igual

Só com essa função é difícil alguém poder ajudar, a não ser que tenha estado exactamente na mesma situação. Coloca aí o resto do código que trata dos anéis, e já agora usa o geshi quando puseres código :thumbsup:

keres k meta aki 600 linhas de codigo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O tratamento dos anéis ocupa-te 600 linhas de código?? Mas coloca pelo menos as funções de inicialização do anel e de remoção de elementos para termos mais algumas bases, se for preciso mais pedimos :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O tratamento dos anéis ocupa-te 600 linhas de código?? Mas coloca pelo menos as funções de inicialização do anel e de remoção de elementos para termos mais algumas bases, se for preciso mais pedimos :thumbsup:

Aki fica td em relaçao a este anel:

typedef struct aux{
char AUX[10];
struct aux *prox;
struct aux *ant;
}ANEL_AUX;

typedef ANEL_AUX *AP_AUX;

AP_AUX inic_ANEL3(void){
AP_AUX aux;

aux = calloc(1,sizeof(ANEL_AUX));

if(aux == NULL){
	printf("ERRO na criacao do registo para a base\n");
	exit(0);
}
aux->prox = aux;
aux->ant = aux;
return aux;
}

void insere_ANEL_aux(AP_AUX actual,char prog[]){
AP_AUX aux;

aux = calloc(1,sizeof(ANEL_AUX));
if(aux == NULL){
	printf("ERRO na insercçao das dependencias\n");
	return;
}
strcpy(aux->AUX ,prog);
aux->prox = actual;
aux->ant = actual->ant;
(actual->ant)->prox = aux;
actual->ant = aux;
}

void insere_ANEL2_aux(AP_AUX actual, char nome[]){
AP_AUX aux,aux2;
int j=0;

aux=actual->prox;
aux2=actual;	
while(aux!= actual){
	aux = aux->prox;
	j++;
}
if(j == 0){
	insere_ANEL_aux(actual,nome);
}else{
	while(j!=0){
		if(strcmp(aux2->AUX,nome)){
			aux2 = aux2->prox;
			j--;
		}
	}
	if(j == 0){
		insere_ANEL_aux(actual,nome);
	}			
}
}	

estas de insera a segunda verifica se ja la esta akele elemento e so manda inserir (primeira) se n estiver

void conta_elementos_aux (AP_AUX actual, int *i){
AP_AUX aux;

aux = actual->prox;
while(aux!=actual){
	aux = aux->prox;
	(*i)++;
}
}
esta é que é a conta a outra foi copiada mas com variaveis diferentes pk o codigo tava no portatil

void remove_aux(AP_AUX actual){

(actual->ant)->prox = actual->prox;
(actual->prox)->ant = actual->ant;
free(actual);
}

E pronto sao estas funçoes

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa mas não percebi a dúvida. podes explicar explicitamente? :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

basicamente depois de remover algo do anel ficando a lista vazio se depois for a esta funçao

void conta_elementos_aux (AP_AUX actual, int *i){
AP_AUX aux;

aux = actual->prox;
while(aux!=actual){
	aux = aux->prox;
	(*i)++;
}
}

ele fica num while infinito sendo aux = a actual

vou testar melhor kando remove e fica la kalker coisa pa ver se funciona

tive a testar e kando fica la kalker coisa a funçao funciona, so mm kando o anel fica vazio é que entra em ciclo infinito

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É lógico que fica num ciclo infinito.

Porque tu atribuis ao aux o nó seguinte de actual, logo todos os nós seguintes vão ser diferentes do aux.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Exacto. Não tinha percebido que era quando removias tudo.

Aliás, tu quando removes tudo "actual" devia ser igual a null, e actual->prox não deveria existir.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É lógico que fica num ciclo infinito.

Porque tu atribuis ao aux o nó seguinte de actual, logo todos os nós seguintes vão ser diferentes do aux.

isso ta mal pk sendo um anel e estando este vazio o actual->prox bem como ou actual->ant apontam po actual, logo se o aux = actual->prox é o mm que ter aux = actual.

segundo um prof meu os aneis kando iniciados tem sempre um componente k n se deve mexer, é o unico componente neste anel kando akela funçao é xamada e ta td nulo é um componente tipo pa dizer k ha akele anel axo eu, o meu prof em todods os exemplos deixa akele componente em paz e faz como se ele n existisse

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

segundo um prof meu os aneis kando iniciados tem sempre um componente que n se deve mexer, é o unico componente neste anel kando akela funçao é xamada e ta td nulo é um componente tipo pa dizer que ha akele anel axo eu, o meu prof em todods os exemplos deixa akele componente em paz e faz como se ele n existisse

Esse nó é chamado de sentinela.

E quanto ao código, está a funcionar com o seguinte programa de teste:

void main() {
int i=0;
AP_AUX anel=inic_ANEL3();
insere_ANEL2_aux(anel, "coiso1");
insere_ANEL2_aux(anel, "coiso2");
insere_ANEL2_aux(anel, "coiso3");
insere_ANEL2_aux(anel, "coiso4");
insere_ANEL2_aux(anel, "coiso5");
conta_elementos_aux(anel, &i);
remove_aux(anel->prox);
remove_aux(anel->prox);
remove_aux(anel->prox);
remove_aux(anel->prox);
remove_aux(anel->prox);
i=0;
conta_elementos_aux(anel, &i);
}

em Visual Studio 2005. Que compilador usas?

Nota: considera incluir um

*i=0;

no inicio da função conta_elementos_aux para evitar ter que inicializar a variável i antes d se chamar essa função.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em Visual Studio 2005. Que compilador usas?

Uso o pior k existe... cygwin, na universidade é k uso linux mm eu curtia usar outro kalker mas sem contar com linux é o unico em k sei trabalhar e n tenho os cds de instalaçao de linux aki...

Nota: considera incluir um

*i=0;

no inicio da função conta_elementos_aux para evitar ter que inicializar a variável i antes d se chamar essa função.

ok

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um grande passo estar a dizer que é do compilador... Vou ver se tenho o cygwin aqui para instalar. Qual é a versão que usas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um grande passo estar a dizer que é do compilador... Vou ver se tenho o cygwin aqui para instalar. Qual é a versão que usas?

Ui  isso é k é pior... como é k se ve?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Afinal qual era o problema?

Nao faço a minima, tive k refazer a funçao k xamava a funçao conta, nunca soube kal era o prob, pk uso a funçao noutros sitiso e da td bem .... so nakele caso é k n dava, mas alterei akilo e ja ta td bem, agr falta acabar o trabalho.... mas o k ta feito funciona bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora