Jump to content

Eliminar dados de uma lista ligada carregados de um ficheiro de texto


Recommended Posts

Posted (edited)

Boa Tarde, na realização do meu projecto eis que me deparo com outro erro, neste caso quando elimino um nó carregado de um ficheiro de texto, o programa deixa de responder e quando tento abrir o ficheiro este tem a sua informação toda em branco. A função pede um código ao utilizador, valida e se existir na lista ligada, esse nó deverá ser eliminado.

Eis o código ao qual não sei se a abordagem será a mais correcta.

no_emprestimo *EntregaEmprestimos(no_emprestimo *plista)
{


no_emprestimo *aux=plista, *ant=NULL;
char codigo[18],now[80];
int i;
struct tm *n;
_int64 rawtime;
time (&rawtime);
n= localtime ( &rawtime );
strftime(now,80,"%d-%m-%Y",n);
printf("\nData Actual:%s",now);
do{

 puts("\nISBN:***-*-**-******-* : ");
 fflush(stdin);
 gets(codigo);

}while(codigo[3]!='-'||codigo[5]!='-'||codigo[8]!='-'||codigo[15]!='-');

while(aux && (strcmp(aux->emp.isbn,codigo)))
   {
	ant=aux;
	aux=aux->next;
   }
   if(aux == NULL)

	printf("Ocorreu um erro de validação");

   else
   {
	if(ant == NULL)

	 plista=aux->next;

	else

	 ant->next=aux->next;

	free(aux);
	printf("O Documento com o ISBN %s foi eliminado da Lista de Empréstimos\n", codigo);
	}
	system("pause");
	return plista;


  }

Em seguida quando clico na função de mostragem da lista ligada, o projecto deixa de funcionar e o ficheiro.txt fica vazio e não apaga apenas aquele a que se referia a função. Se pudessem dar uma vista de olhos agradecia 😉

void MostraEmprestimo (no_emprestimo *plistaemp)
   {	 printf("\n");
		 printf("Nome: %s",plistaemp->emp.nome);
		 printf("\nIsbn: %s",plistaemp->emp.isbn);
		 printf("\nData de Requisição: %s",plistaemp->emp.datareq);
		 printf("\nData de Entrega: %s",plistaemp->emp.dataent);
		 printf("\nPrazo: %d\n",plistaemp->emp.prazo);
printf("\n");
   }

void ApresentaEmprestimo(no_emprestimo *plistaemp)
   {

		 if(plistaemp)
					   while(plistaemp)
					   {
							  MostraEmprestimo(plistaemp);
	  if(plistaemp!=NULL)
	  plistaemp=plistaemp->next;
					   }
				else
					   printf("\n**** LISTA VAZIA ****\n");

				}
Edited by bcouto
Posted

Tal como eu pensava.

No teu caso a variavel inicio nao 'e alterada pela chamada `a funcao. Para alterares a variavel ou alteras a funcao para aceitar um ponteiro para o ponteiro (senao a alteracao 'e feita apenas `a variavel local) ou, como ja puseste um 'return' na tua funcao, aproveita esse valor:

inicio = EntregaEmprestimos(inicio)

Para completar a ideia, a alteracao da funcao passaria pelo prototipo

no_emprestimo *EntregaEmprestimos(no_emprestimo **plista);

e chamando a funcao com o endereco do ponteiro

no_emprestimo *inicio=NULL;
EntregaEmprestimos(&inicio);

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Tal como eu pensava.

No teu caso a variavel inicio nao 'e alterada pela chamada `a funcao. Para alterares a variavel ou alteras a funcao para aceitar um ponteiro para o ponteiro (senao a alteracao 'e feita apenas `a variavel local) ou, como ja puseste um 'return' na tua funcao, aproveita esse valor:

inicio = EntregaEmprestimos(inicio)

Para completar a ideia, a alteracao da funcao passaria pelo prototipo

no_emprestimo *EntregaEmprestimos(no_emprestimo **plista);

e chamando a funcao com o endereco do ponteiro

no_emprestimo *inicio=NULL;
EntregaEmprestimos(&inicio);

Resultou, problema resolvido 😉

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.