Jump to content

Problema com listas ligadas


Go to solution Solved by KTachyon,

Recommended Posts

Guest jorgemrt1992
Posted

Boa tarde,

gostaria de pedir a vossa ajuda para encontrar o problema neste código.

O código representa os corredores de um armazém, cada corredor tem armários, que tem produtos.

Ao executar o programa, o output que tenho é apenas os armários e produtos do primeiro corredor.

No entanto deveria ter era 4 corredores, cada um com 3 armários, cada um com x produtos.

Os dados estão armazenados num ficheiro binário com inteiros.

pcorredor carregaInfo(char *fileName)
{
 FILE *f;
 int numCorredores, numArmarios, numProdutos;
 int i, j, k, aux;
 int idc = 1, ida = 1;
 pcorredor novoc, ultimoc = NULL, lista = NULL;
 parmario novoa, primeiroa = NULL, ultimoa = NULL;
 pproduto novop, primeirop = NULL, ultimop = NULL;

 f = fopen(fileName, "rb");
 if(f == NULL)
		 return NULL;

 fread(&numCorredores, sizeof(int), 1, f);
 fread(&numArmarios, sizeof(int), 1, f);

 //criar os corredores
 for(i = 0;i<numCorredores;i++)
 {
		 novoc = (pcorredor) malloc(sizeof(corredor));
		 if(novoc == NULL)
		 {
				 fclose(f);
				 return lista;
		 }
		 novoc->idCorredor = idc;
		 idc++;

		 novoc->prox = NULL;

		 printf("corredor %d\n", novoc->idCorredor);

		 //criar os armarios
		 for(j = 0;j<numArmarios;j++)
		 {
				 novoa = (parmario) malloc(sizeof(armario));
				 if(novoa == NULL)
				 {
						 fclose(f);
						 return lista;
				 }

				 novoa->idArmario = ida;
				 ida++;

				 novoa->prox = NULL;

				 printf(" armario %d\n", novoa->idArmario);

				 //criar produtos
				 fread(&numProdutos, sizeof(int), 1, f);
				 for(k = 0;k<numProdutos;k++)
				 {
						 novop = (pproduto) malloc(sizeof(produto));
						 if(novop == NULL)
						 {
								 fclose(f);
								 return lista;
						 }

						 fread(&aux, sizeof(int),1,f);
						 novop->idProduto = aux;
						 fread(&aux, sizeof(int), 1, f);
						 novop->quant = aux;

						 novop->prox = NULL;

						 printf(" produto %d quant %d\n", novop->idProduto, novop->quant);

						 if(primeirop == NULL)
								 primeirop = novop;
						 else
								 ultimop->prox = novop;
						 ultimop = novop;
				 }

				 novoa->prod = primeirop;
				 primeirop = NULL;

				 if(primeiroa == NULL)
						 primeiroa = novoa;
				 else
						 ultimoa->prox = novoa;

				 ultimoa = novoa;
		 }
		 numArmarios = 0;
		 novoc->arm = primeiroa;
		 primeiroa = NULL;

		 if(lista == NULL)
				 lista = novoc;
		 else
				 ultimoc->prox = novoc;

		 ultimoc = novoc;
 }

 fclose(f);
 return lista;

}

Obrigado

  • Solution
Posted

Esse trabalho não é para entregar até segunda? Já devia ter sido começado há mais tempo…

O teu problema é que estás a tentar fazer tanta coisa na mesma função que deixas de conseguir ler convenientemente. O truque de um bom código é cingires funcionalidade muito simples numa pequena função. Tens uma função que cria listas de produtos dentro de listas de armários dentro de listas de corredores. Não faria sentido isolares cada um destes níveis numa função?

Relativamente ao teu problema - para que é que serve esta linha?

numArmarios = 0;

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Guest jorgemrt1992
Posted (edited)

A chamada de atenção para essa linha já me resolveu o problema. Como dizes, o problema acabou por ser a função gigante. O que eu queria era reiniciar a variável que atribui o id aos armários e não a variável com o numero de armários.

Obrigado

Edited by jorgemrt1992

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.