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

x3minater

Listas

14 mensagens neste tópico

Boas,

estou a fazer um trabalho que consiste em tirar valores de um ficheiro e colocá-los em estruturas do estilo:

nome;

idade;

telefone;

. (até aqui tudo bem). O que se pretende também é que essas estruturas estejam ligadas entre si, de modo a formar um lista. Para isso criei outra estrutura com 2 campos: - uma variavel do tipo da estrutura anterior; - e apontador para a próxima estrutura (deste segundo tipo). (tranquilo até aqui também)

O que eu preciso de fazer agr é, à medida que leio os valores do ficheiro, coloca-los no fim da lista. Como é que eu posso fazer isso de uma maneira não demasiado complicada :(?

Preciso também de verificar se, na lista, existe algum elemento repetido, ou seja com o mesmo nome (não interessam os outros valores), e ou escrever por cima ou parar o programa, dependendo da funçao utilizada para a leitura do ficheiro... como faço isso?  :)

Obrigado desde já  :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Encontrei este código... mas como faço isto sem usar o break?

walker = *elem;
while (walker != NULL) {
	/* Verificar se o aluno ja existe */
	if ((walker->nome) == nome) {
		existe = 's';
		break;
	}
	/* Avancar na lista */
	last = walker;
	walker = walker->proximo;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não entendo muito bem porque é que não queres utilizar o break, mas podes utilizar uma flag na condição do while, inicializá-la a 1, substituir o break pela afectação da flag a zero e executar o que está depois do if dentro da cláusula else:

	char flag = 1; /* flag para saber quando terminar o while */
...
while (... && flag != 0) {
	if (...) {
		/* aluno já existe */
		...
		flag = 0; /* colocar a flag a 0 para terminar o while */
	}
	else { /* Avancar na lista */ }
}

Já agora, o (walker->nome) == nome não vai funcionar como esperas. Utiliza a função strcmp

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A maneira mais simples é a que o x3minater enunciou: uma struct com um campo next (que aponte para o próximo elemento da lista, ou para NULL se for o último elemento) e outro campo que aponte para o seu valor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou então, se não quiseres usar o walker para nada:

walker = *elem;
while (walker != NULL) {
/* Verificar se o aluno ja existe */
if ((walker->nome) == nome) {
	existe = 's';
	walker = NULL;
}
else  {
	/* Avancar na lista */
	last = walker;
	walker = walker->proximo;
}
}

De qualquer forma deves encapsular isto dentro de uma função, assim como o código de "inserir" que hás-de fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pela dica das flags... e sim preciso do walker :confused:

Outra coisa, como é que eu faço se quiser eliminar todos os elementos duma lista?

	while (walker != NULL && existe!=1){
	if(strcmp(walker->aluno.nome, nome)==0){
		existe = 1;
		printf("**Ola**\n"); //debug
	}
	if(strcmp(walker->aluno.nome, "all")==0){
		todos = 1;
	}
	if(strcmp(walker->aluno.nome, nome)!=0 && strcmp(walker->aluno.nome, "all")!=0){
		printf("**Ola3**\n"); //debug
		ant = walker;
		walker = walker->prox;
	}
}

if(todos == 1){

}

como é que ficava a parte do if(todos == 1) ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebo o que queres fazer com o teu código. Para eliminar todos os elementos, deves fazer uma função só para fazer isso.

Nisto de listas e estruturas com ponteiros a forma mais fácil de pensar é fazer bonecos :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

exacto... como é que faço essa funçao? :confused: (que vai tar dentro do if(todos == 1 ){...})

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que percorrer a lista e libertar a memória dos elementos, um a um.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Posso fazer assim:

		printf("Aluno a remover: "); scanf("%s",nome);

walker = *base;
ant = NULL;

if(strcmp(nome, "all")==0){
	printf("Eliminar todos os alunos.\n");

	while(walker != NULL){
		*base = walker->prox;
		free(walker);
		walker = *base;
	}

}
else{			while (walker != NULL && existe!=1){
	if(strcmp(walker->aluno.nome, nome)==0){
		existe = 1;
		printf("**Ola**\n"); //debug
	}
	else{
		printf("**Ola3**\n"); //debug
		ant = walker;
		walker = walker->prox;
	}
}
	}

Se se escrever "all" ele devia eliminar todos os objectos da lista...mas isto n ta a dar  :wallbash: tou a fazer as verificações e a percorrer a lista bem?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Onde é que tá a declaração de "base"?

tava na declaraçao da funçao:P  OBJECTO **base;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Axo que assim ja funciona:

]while(*base != NULL){
		*base = (*base)->prox;
		free(aux);
		aux = *base;
	}

Thanks anyway  :confused:

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