Jump to content
Dexter's Lab

Filas - problema com último elemento

Recommended Posts

Dexter's Lab

Boas pessoal,

Estou a meio deste exercício de programação. Não estou a conseguir aceder ao último elemento da Fila: ou seja, faço Listar mas o último elemento não aparece.

Agradecia se me pudessem dar uma luz sobre o que está a acontecer.

Código:

#include<stdio.h>
#include<string.h>
/* Estruturas dos nós e de pessoas */
struct person { char name[30]; size_t number; };
struct node { struct person student; struct node *next; };

/* Inicio e fim criados, a apontar para NULL */
struct node *END = NULL;
struct node *START = NULL;
unsigned short size = 0;
#define SIZE 5
struct person student[size];

void input();
void enter(struct person student);  /* Entrada na Fila */
struct node *out();	   /* Saída da Fila */
void show();
int menu();

int main(void)
{
  do { menu(); } while(0);
  return 0;
}
int menu()
{
unsigned short choice, c;
  char n;
do {
  system("cls");
   printf("\n\t1.....Log New Person");
  printf("\n\t2.....Take last Element");
  printf("\n\t3.....Show Queue");
  printf("\n\t0.....Exit");
  printf("\n\n\t\tChoice: "); scanf("%d", &choice);
switch(choice) {
		case 1:
	   do {
		   printf("Do you wish to insert a new person to the line? [s/N]", size);
		 n = getch();
		 if(n == 's' || n == 'S')
			input();
	   } while(n == 'S' || n == 's');
		 break;
	  case 2: out(); break;
	case 3: show(); break;
	case 0: exit(0);
	default: printf("Invalid! Please try again..."); getch();
	}
} while (choice);
}

void input()
{
  short c;
   system("cls");
   fflush(stdin);
 printf("Form #%d\n\n", size+1);
   printf("Name: "); gets(student[c].name);
   printf("Number: "); scanf("%d", &student[c].number);
 enter(student[c]);
}
void enter(struct person student)
{
/* Cria o nó [elemento] com a memória necessária */
struct node *element = (struct node*) malloc(sizeof(struct node));
  if(element) {
	 strcpy(element->student.name, student.name);
   element->student.number = student.number;
   element->next = NULL;
   size++;
   if(END) // se a fila já tem elementos
	  END->next = element;
   else  // se a fila está no início
	  START = element;
   }
 END = element;
}
struct node *out()
{
struct node *element = START;
  if(element) {
   START = element->next;
  if(START == NULL)
	 END = NULL;
  }
 else END = NULL;
 return element;
}

void show() {
int c;
 struct node *element = START;
 do {
printf("\n\n");
puts(element->student.name);
printf("%d", element->student.number);
element = element->next;
  } while(element->next != NULL);
 getch();
}

Edited by Dexter's Lab

Share this post


Link to post
Share on other sites
HappyHippyHippo

nem vou comentar na quantidade de problemas/má práticas que o código tem.

fica aqui somente a razão do teu problema :

do {
 printf("\n\n");
 puts(element->student.name);
 printf("%d", element->student.number);
 element = element->next;      // salta para o elemento seguinte
} while(element->next != NULL); // se o elemento iterado não tiver elemento seguinte (último elemento) então termina

conclusão : quando element tiver o valor da posição de memória do último elemento da lista, o ciclo termina, logo o elemento não é apresentado


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dexter's Lab

HHHippo, obrigado pela atenção. Vou corrigir o problema. Se no entanto me pudesses dizer que más práticas tem o código, eu agradeceria. Estou a aprender e por essa razão suscetível a erros práticos de iniciante. No entanto gostaria de corrigi-los para poder evoluir e não voltar a repeti-los.

Obrigado desde já.

Share this post


Link to post
Share on other sites
HappyHippyHippo

primeiro de tudo, a indentação. não completamente horrível, mas poderia ser muito melhor

agora o código:

#include<stdio.h>
#include<string.h>

/* Estruturas dos nós e de pessoas */
struct person
{
 char name[30];
 size_t number;
};

struct node
{
 struct person student;
 struct node *next;
};

/* Inicio e fim criados, a apontar para NULL */
//-------------------------------------------------
// VARIÁVEIS GLOBAIS >> não, não e não !!!
//-------------------------------------------------
struct node * END = NULL;
struct node * START = NULL;
unsigned short size = 0;
#define SIZE 5
struct person student[size];

void input();
void enter(struct person student);  /* Entrada na Fila */
struct node * out();                /* Saída da Fila */
void show();
int menu();

int main(void)
{
 //-------------------------------------------------
 // Quando é que este ciclo termina ?
 //-------------------------------------------------
 do
 {
   menu();
 } while(0);

 return 0;
}
int menu()
{
 unsigned short choice, c;
 char n;

 do
 {
   //-------------------------------------------------
   // eu percebo o uso do system('cls') mas isto estoira
   // se compilado num SO diferente
   //-------------------------------------------------
   system("cls");
   printf("\n\t1.....Log New Person");
   printf("\n\t2.....Take last Element");
   printf("\n\t3.....Show Queue");
   printf("\n\t0.....Exit");
   printf("\n\n\t\tChoice: "); scanf("%d", &choice);

   switch(choice)
   {
     case 1:
       do
       {
         printf("Do you wish to insert a new person to the line? [s/N]", size);

         //-------------------------------------------------
         // nem sei como compilar porque getch não está definido
         // em nenhuma das bibliotecas declaradas, usa getchar()
         //
         // além disso ...
         // a tua aplicação não se comporta estranhamanete do género:
         // - faz a pergunta várias vezes quando respondes só uma ?
         // - às vezes parece que ignora a tua resposta ?
         // - etc ... ?
         //-------------------------------------------------
         n = getch();

         if(n == 's' || n == 'S')
           input();
       } while(n == 'S' || n == 's');
       break;
     case 2:
       out();
       break;
     case 3:
       show();
       break;
     case 0:
       exit(0);
     default:
       printf("Invalid! Please try again...");
       //-------------------------------------------------
       // getch() outra vez
       //-------------------------------------------------
       getch();

       //-------------------------------------------------
       // eu sei que é o default, mas é boa prática ter o break na mesma
       //-------------------------------------------------
   }
 } while (choice);
}

void input()
{
 short c;

 //-------------------------------------------------
 // system('cls') outra vez
 //-------------------------------------------------
 system("cls");

 //-------------------------------------------------
 // podes dizer onde no seguinte link :
 // http://pubs.opengroup.org/onlinepubs/009696799/functions/fflush.html
 // a descrição do comportamento da função quando reccebe um stream de entrada ?
 //-------------------------------------------------
 fflush(stdin);

 printf("Form #%d\n\n", size+1);
 printf("Name: "); gets(student[c].name);
 printf("Number: "); scanf("%d", &student[c].number);

 enter(student[c]);
}
void enter(struct person student)
{
 //-------------------------------------------------
 // o cast é completamente desnecessário (aliás, só atrapalha)
 //-------------------------------------------------
 /* Cria o nó [elemento] com a memória necessária */
 struct node *element = (struct node*) malloc(sizeof(struct node));

 //-------------------------------------------------
 // pensa bem no que acontece se o malloc falha (element == NULL)
 //-------------------------------------------------
 if(element)
 {
   //-------------------------------------------------
   // copia de uma estrutura é feita com o operador atribuição
   // element->student = student
   //-------------------------------------------------
   strcpy(element->student.name, student.name);
   element->student.number = student.number;
   element->next = NULL;

   size++;
   if(END) // se a fila já tem elementos
     END->next = element;
   else  // se a fila está no início
     START = element;
 }

 END = element;
}

struct node *out()
{
 struct node * element = START;

 if(element)
 {
   //-------------------------------------------------
   // o menu dizia que ia tirar o último elemento
   // é isso que está a acontecer ?
   //-------------------------------------------------
   START = element->next;
   if(START == NULL)
     END = NULL;
 }
 else
   //-------------------------------------------------
   // que valor tem END se a lista está vazia ? (element == NULL)
   //-------------------------------------------------
   END = NULL;

 return element;
}

void show()
{
 int c;
 struct node *element = START;

 do {
   printf("\n\n");
   puts(element->student.name);
   printf("%d", element->student.number);
   element = element->next;

   //-------------------------------------------------
   // o problema do while já foi dito no post anterior
   //-------------------------------------------------
 } while(element->next != NULL);

 //-------------------------------------------------
 // getch() outra vez
 //-------------------------------------------------
 getch();
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

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.