2012-11-24 11 views
1

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).

+3

'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); '. –

+1

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

+0

Merci @DanielFischer c'était tout. – user1287523

Répondre

0
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 ballants.

malloc() la mémoire:

struct fifo_element *element = malloc(sizeof *element); 
+0

Il suffit de transformer le commentaire de Daniel en une réponse, donc cela n'apparaît plus sous * sans réponse *. – Mike