Je dois mettre en place une file d'attente en C pour une petite partie d'un projet de devoirs. Je fais cela depuis quelques années dans différentes langues, donc je suis surpris que j'ai beaucoup de problèmes. Mon problème est que la valeur de Head est continuellement changée en valeur ajoutée la plus récente.FIFO Queue Head Pointer incorrect
Voici mon code à ce jour:
void Enqueue(fifo* queue, int customerData)
{
//Determine if a head or tail exists
int tailExists = 0;
if(queue->tail->customerId >= 0){
tailExists = 1;
}
//Create new elements
struct fifo_element a, *element;
element = &a;
if(tailExists == 1)
printf("test2 the head is %d\t", queue->head->customerId);
element->customerId = customerData;
if(tailExists == 1)
printf("test3 the head is %d\t", queue->head->customerId);
//Set the next element to the current tail
if(tailExists == 1)
element->next = queue->tail;
else
element->next = NULL;
//Set the prev element to null
element->prev = NULL;
//Set the last element's previous to the new element
if(tailExists == 1){
queue->tail->prev = element;
}
//Set the tail to the new element
queue->tail = element;
if(tailExists == 0){
queue->head = element;
}
printf("the head is %d\t", queue->head->customerId);
printf("the tail is %d\t", queue->tail->customerId);
}
Sur la base des lignes de printf, la ligne element->customerId = customerData;
est à l'origine de la valeur pour changer la tête. Cependant, je ne vois pas comment c'est possible ... Pourquoi cela se passe-t-il?
(Mon programme de test exécute simplement une boucle for de 0 à> 4, appelant enqueue avec une valeur customerData de i).
'element = & a;' vous insérez un pointeur vers une variable locale dans la file d'attente, après le retour de la fonction, la variable locale n'existe plus, et La file d'attente contient un pointeur qui pend. 'malloc' la mémoire,' struct fifo_element * élément = malloc (sizeof * élément); '. –
Faites-vous une faveur * énorme * et n'essayez pas d'utiliser un nœud sentinelle comme le symbole de votre file d'attente "vide" ou non. Gérez correctement vos pointeurs de queue et de tête pour qu'ils pointent vers un contenu valide * dans * la file d'attente, ou NULL si la file d'attente est vide. Le reste s'écrira pratiquement lui-même si vous le suivez strictement. – WhozCraig
Merci @DanielFischer c'était tout. – user1287523