2017-03-12 2 views
0

L'opération enqueue() qui insère correctement un nœud dans la file d'attente contient la logique de base de mon programme. J'ai mis en place la même file d'attente prioritaire en utilisant la récursivité et je sais que le reste du programme fonctionne bien. Maintenant, je veux implémenter la file d'attente prioritaire en utilisant l'itération commune. L'opération enqueue() devrait fonctionner selon mon projet de plan ci-dessous.Implémentation de la liste chaînée de la file d'attente prioritaire dans l'échec de l'opération C-enqueue()

enter image description here

Cependant quand je lance le programme échoue, sans aucune erreur du tout (testé dans VS et gcc). Je ne peux pas comprendre où ma logique dans celui-ci échoue et cela me rend fou. L'aide sera appréciée!

Le code suit.

// The PQ is sorted according to its value 
// Descending order sorted insertion (bigger first -> smaller last) 
void enqueue(pqType val, PriorityQueue *PQ) 
{ 
if (!isFull(PQ)) { 
    PQ->count++; 

    Node *currentNode = PQ->headNode; // Iterate through PQ using currentNode 
    Node *prevNode = NULL;    // the previous Node of our current iteration 
    Node *newNode = (Node*) malloc(sizeof(Node)); // The new Node that will be inserted into the Queue 

    int i = 0; 
    while (i < MAX_QUEUE_SIZE) { 
     // if PQ is empty, or if val is larger than the currentNode's value then insert the new Node before the currentNode 
     if ((currentNode == NULL) || (val >= currentNode->value)) { 
      newNode->value = val; 
      newNode->link = currentNode; 
      prevNode->link = newNode; 
      break; 
     } 
     else { 
      prevNode = currentNode; 
      currentNode = currentNode->link; 
     } 
     i++; 
    } 
    //free(currentNode); 
    //free(prevNode); 
} 
else 
    printf("Priority Queue is full.\n"); 
} 
+0

sur votre premier equeue (PQ est vide) cette ligne "prevNode-> link = newNode" devrait échouer –

+0

Pourquoi une implémentation liste chaînée? Un tas est généralement un meilleur choix pour une file d'attente prioritaire. – pjs

Répondre

1

Je pense que le problème est dans le premier Enqueue (quand PQ est vide), dans ce cas, vous devez changer le PQ->headNode = newNode pas prevnode->link = newNode, après la première enqueue Je pense que votre code fonctionnera très bien.

if(prevNode == NULL) 
{ 
    PQ->headNode = newNode; 
} 
else 
{ 
    prevNode->link = newNode; 
} 
+0

Ahhh ... je n'ai pas considéré cela. Tu as raison. Merci beaucoup mon ami. –