Olá pessoal, estou tendo problemas ao implementar uma fila de prioridade,
o usuario entra com o numero de prioridades, depois com as pessoas em um arquivo csv.
o programa deve executar certas funcoes, mas estou tendo problemas na inserção, as filas do vetor de prioridades está sempre NULL, alguém poderia me ajudar a consertar isso?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct person {
long long int cpf;
char name[100];
char gender;
int priority;
} person;
typedef struct list {
person * info;
struct list * next;
} list;
typedef struct command {
char command;
int parameter;
} command;
int read_command(command * c) {
char buffer[10];
int ret;
ret = scanf("%c", &(c->command));
if (ret == EOF) {
return 1;
}
c->parameter = -1;
if (c->command == 'C' || c->command == 'I') {
scanf("%d", &(c->parameter));
}
gets(buffer);
return 0;
}
person * read_person() {
char buffer[512];
person * p = malloc(sizeof(person));
gets(buffer);
sscanf(buffer, "%lld,%[^,],%c,%d,", &(p->cpf), p->name, &(p->gender), &(p->priority));
return p;
}
void insert_element(list ** queue, int how_many) {
int i;
list *aux;
for(i = 0; i < how_many; i++) {
person * p;
p = read_person();
list * newp =(list*) malloc(sizeof(list ));
newp->info = p;
newp->next = NULL;
aux = queue[p->priority];
if(queue[p->priority]==NULL){
aux = newp;
}else{
while(aux->next!=NULL)
aux=aux->next;
aux->next = newp;
}
}
}
void remove_element(list *queue, int position){
list *p = queue;
printf("%lld, %s, %c,\n", p->info->cpf, p->info->name, p->info->gender);
queue = p->next;
free(p);
}
void remove_next(list ** queue, int max_priority) {
list *p = queue[max_priority];
int j = max_priority;
while(p==NULL && j>0){
j--;
p = queue[j];
}
if(p!=NULL)
remove_element(p, j);
}
void print_queue(list **queue, int size){
int i;
list *aux;
for(i=size; i>=0; i--){
aux = queue[i];
printf("[%d]\n", i);
while(aux!=NULL){
printf("%lld, %s, %c,\n", aux->info->cpf, aux->info->name, aux->info->gender);
aux = aux->next;
}
}
printf("\n");
}
void cleanup(list **queue, int size){
int i;
list *aux;
for(i=size; i>=0; i--){
aux=queue[i];
while(aux!=NULL){
list *t = aux->next;
free(aux);
aux = t;
}
}
}
void execute_command(command c, list ** queue, int max_priority) {
switch (c.command) {
case 'C' :
cleanup(queue, max_priority);
case 'I' :
insert_element(queue, c.parameter);
break;
case 'P' :
print_queue(queue, max_priority);
break;
case 'R' :
remove_next(queue, max_priority);
}
}
int main() {
list ** queue;
int file_end = 0;
int queue_size, i;
char buffer[10];
scanf("%d", &queue_size);
gets(buffer);
queue = (list**)malloc((queue_size+1)*sizeof(list*));
for(i=0; i<=queue_size; i++){
queue[i]=(list*)malloc(sizeof(list));
queue[i]=NULL;
}
while (! file_end) {
command c;
file_end = read_command(&c);
if(! file_end) {
execute_command(c, queue, queue_size);
}
}
cleanup(queue, queue_size);
free(queue);
}
Pergunta
kuschausky
Olá pessoal, estou tendo problemas ao implementar uma fila de prioridade,
o usuario entra com o numero de prioridades, depois com as pessoas em um arquivo csv.
o programa deve executar certas funcoes, mas estou tendo problemas na inserção, as filas do vetor de prioridades está sempre NULL, alguém poderia me ajudar a consertar isso?
#include <stdlib.h> #include <stdio.h> #include <string.h> typedef struct person { long long int cpf; char name[100]; char gender; int priority; } person; typedef struct list { person * info; struct list * next; } list; typedef struct command { char command; int parameter; } command; int read_command(command * c) { char buffer[10]; int ret; ret = scanf("%c", &(c->command)); if (ret == EOF) { return 1; } c->parameter = -1; if (c->command == 'C' || c->command == 'I') { scanf("%d", &(c->parameter)); } gets(buffer); return 0; } person * read_person() { char buffer[512]; person * p = malloc(sizeof(person)); gets(buffer); sscanf(buffer, "%lld,%[^,],%c,%d,", &(p->cpf), p->name, &(p->gender), &(p->priority)); return p; } void insert_element(list ** queue, int how_many) { int i; list *aux; for(i = 0; i < how_many; i++) { person * p; p = read_person(); list * newp =(list*) malloc(sizeof(list )); newp->info = p; newp->next = NULL; aux = queue[p->priority]; if(queue[p->priority]==NULL){ aux = newp; }else{ while(aux->next!=NULL) aux=aux->next; aux->next = newp; } } } void remove_element(list *queue, int position){ list *p = queue; printf("%lld, %s, %c,\n", p->info->cpf, p->info->name, p->info->gender); queue = p->next; free(p); } void remove_next(list ** queue, int max_priority) { list *p = queue[max_priority]; int j = max_priority; while(p==NULL && j>0){ j--; p = queue[j]; } if(p!=NULL) remove_element(p, j); } void print_queue(list **queue, int size){ int i; list *aux; for(i=size; i>=0; i--){ aux = queue[i]; printf("[%d]\n", i); while(aux!=NULL){ printf("%lld, %s, %c,\n", aux->info->cpf, aux->info->name, aux->info->gender); aux = aux->next; } } printf("\n"); } void cleanup(list **queue, int size){ int i; list *aux; for(i=size; i>=0; i--){ aux=queue[i]; while(aux!=NULL){ list *t = aux->next; free(aux); aux = t; } } } void execute_command(command c, list ** queue, int max_priority) { switch (c.command) { case 'C' : cleanup(queue, max_priority); case 'I' : insert_element(queue, c.parameter); break; case 'P' : print_queue(queue, max_priority); break; case 'R' : remove_next(queue, max_priority); } } int main() { list ** queue; int file_end = 0; int queue_size, i; char buffer[10]; scanf("%d", &queue_size); gets(buffer); queue = (list**)malloc((queue_size+1)*sizeof(list*)); for(i=0; i<=queue_size; i++){ queue[i]=(list*)malloc(sizeof(list)); queue[i]=NULL; } while (! file_end) { command c; file_end = read_command(&c); if(! file_end) { execute_command(c, queue, queue_size); } } cleanup(queue, queue_size); free(queue); }Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.