2017-08-29 3 views
2

J'essayais de travailler avec la structure de données de la file d'attente qui est une sorte de file d'attente circulaire. voici le code suivant.Les files d'attente m'entraînent dans un problème bizarre

#include <stdio.h> 
#include <stdlib.h> 

enum boolean{ 
    false,true 
}; 

struct ArrayQueue{ 
    int rare,front; 
    int capacity; 
    int *array; 
}; 

struct ArrayQueue* CreateQueue(int cap) 
{ 
    struct ArrayQueue* queue; 
    queue = (struct ArrayQueue*)malloc(sizeof(struct ArrayQueue)); 
    queue->rare = -1; 
    queue->front = -1; 
    queue->capacity = cap; 
    queue->array = (int*)malloc(sizeof(int)*queue->capacity); 
    int i; 
    for (i=0;i<queue->capacity;i++) 
     queue->array[i] = 0; 
    return(queue); 
} 

enum boolean isFull(struct ArrayQueue *queue) 
{ 
    return((queue->rare+1)%queue->capacity == queue->front); 
} 

enum boolean isEmpty(struct ArrayQueue *queue) 
{ 
    return(queue->front == -1); 
} 

int ElementsInQueue(struct ArrayQueue *queue) 
{ 
    return(((queue->capacity-queue->front)+queue->rare+1)%queue->capacity); 
} 

void En_queue(struct ArrayQueue *queue,int item) 
{ 
    if (isFull(queue) == false) 
    { 
     queue->rare = (queue->rare+1)%queue->capacity; 
     queue->array[queue->rare] = item; 
     if (queue->front == -1) 
      queue->front = queue->rare; 
    } 
} 

int De_queue(struct ArrayQueue *queue) 
{ 
    int data; 
    if (isEmpty(queue) == false) 
    { 
     data = queue->array[queue->front]; 
     queue->array[queue->front] = 0; 
     if (queue->front == queue->rare) 
     { 
      queue->front = -1; 
      queue->rare = -1; 
     } 
     else 
     { 
      queue->front = queue->front+1%queue->capacity; 
     } 
     return data; 
    } 
} 

void Display(struct ArrayQueue *queue) 
{ 
    int i; 
    printf("\n Displaying the queue : \n"); 
    for (i=0;i<queue->capacity;i++) 
     printf("%d ",queue->array[i]); 
} 

int main(void) 
{ 
    int cap,choice,item; 
    struct ArrayQueue *queue; 
    printf("\nEnter the Capacity of Queue: "); 
    scanf("%d",&cap); 
    queue = CreateQueue(cap); 
    while(1) 
    { 
     printf("\n\n"); 
     printf("\n1.Enqueue"); 
     printf("\n2.Dequeue"); 
     printf("\n3.Display"); 
     printf("\n4.Exit"); 
     printf("\nEnter choice: "); 
     scanf("%d",&choice); 
     switch (choice) 
     { 
     case 1: if (isFull(queue) == true) 
       { 
        printf("\nQueue is Full.."); 
        break; 
       } 
       else 
       { 
        printf("\nEnter a number: "); 
        scanf("%d",&item); 
        En_queue(queue,item); 
        Display(queue); 
       } 
       break; 
     case 2: if (isEmpty(queue)== true) 
       { 
        printf("\nQueue is Empty.."); 
        break; 
       } 
       else 
       { 
        item = De_queue(queue); 
        printf("\nItem popped is: %d",item); 
        Display(queue); 
       } 
       break; 
     case 3: Display(queue); 
       break; 
     case 4: exit(0); 
       break; 
     } 

    } 
} 

il a l'air parfait à première vue, mais il a quelques problèmes.

voir les captures d'écran

après l'insertion

2nd. Deleting and inserting simultaneously 3rd. the problem occured

désolé les gars je suce vraiment à expliquer les choses.

mon flux d'entrée était (selon ce modèle) ...

  1. Enqueue
  2. Dequeue
  3. Afficher
  4. sortie

{1,1,1,1 , 2,1,2,1,2,1,2,1,2,1}

    |___| 
        here is the problem 
  • Lorsque j'ai entré 2 pour la suppression de la file d'attente était pleine. mais rien n'a été supprimé. sortie était une valeur de déchets
  • puis j'ai entré 1 pour mettre en file d'attente la file d'attente était plein, mais il n'a pas montré la file d'attente est pleine. Au lieu de cela, il m'a demandé d'entrer un nombre.

(comme je l'ai dequeued d'abord si je pensais à un premier élément enqueue puis d'entrer dans le choix 1. mais encore une fois il m'a demandé d'entrer un numéro.)

je ne pouvais pas comprendre les erreurs. pardonne-moi pour mon explication et mon vocabulaire bizarre. vous essayez le code et donnez le flux d'entrée pour comprendre le problème.

veuillez me guider à ce qui ne va pas exactement. merci d'avance.

+0

lieu de 'sur file d'attente> = avant sur file d'attente> avant + 1% sur file d'attente> capacité,', vouliez-vous dire de mettre entre parenthèses autour de 'sur file d'attente> avant + 1'? – meowgoesthedog

+0

Pour faciliter le test, changez votre fonction 'display()' pour passer de 'head' à' rear' et non de '0' à' capacity'. – SHG

+0

meowgoesthedog merci. ça a marché. :) –

Répondre

0

C'est la bonne réponse. Merci à tous :)

#include <stdio.h> 
#include <stdlib.h> 

enum boolean{ 
    false,true 
}; 

struct ArrayQueue{ 
    int rare,front; 
    int capacity; 
    int *array; 
}; 

struct ArrayQueue* CreateQueue(int cap) 
{ 
    struct ArrayQueue* queue; 
    queue = (struct ArrayQueue*)malloc(sizeof(struct ArrayQueue)); 
    queue->rare = -1; 
    queue->front = -1; 
    queue->capacity = cap; 
    queue->array = (int*)malloc(sizeof(int)*queue->capacity); 
    int i; 
    for (i=0;i<queue->capacity;i++) 
     queue->array[i] = 0; 
    return(queue); 
} 

enum boolean isFull(struct ArrayQueue *queue) 
{ 
    return((queue->rare+1)%queue->capacity == queue->front); 
} 

enum boolean isEmpty(struct ArrayQueue *queue) 
{ 
    return(queue->front == -1); 
} 

int ElementsInQueue(struct ArrayQueue *queue) 
{ 
    return(((queue->capacity-queue->front)+queue->rare+1)%queue->capacity); 
} 

void En_queue(struct ArrayQueue *queue,int item) 
{ 
    if (isFull(queue) == false) 
    { 
     queue->rare = (queue->rare+1)%queue->capacity; 
     queue->array[queue->rare] = item; 
     if (queue->front == -1) 
      queue->front = queue->rare; 
    } 
} 

int De_queue(struct ArrayQueue *queue) 
{ 
    int data; 
    if (isEmpty(queue) == false) 
    { 
     data = queue->array[queue->front]; 
     queue->array[queue->front] = 0; 
     if (queue->front == queue->rare) 
     { 
      queue->front = -1; 
      queue->rare = -1; 
     } 
     else 
     { 
      queue->front = (queue->front+1)%queue->capacity; 
     } 
     return data; 
    } 
} 

void Display(struct ArrayQueue *queue) 
{ 
    int i; 
    printf("\n Displaying the queue : \n"); 
    for (i=0;i<queue->capacity;i++) 
     printf("%d ",queue->array[i]); 
} 

int main(void) 
{ 
    int cap,choice,item; 
    struct ArrayQueue *queue; 
    printf("\nEnter the Capacity of Queue: "); 
    scanf("%d",&cap); 
    queue = CreateQueue(cap); 
    while(1) 
    { 
     printf("\n\n"); 
     printf("\n1.Enqueue"); 
     printf("\n2.Dequeue"); 
     printf("\n3.Display"); 
     printf("\n4.Exit"); 
     printf("\nEnter choice: "); 
     scanf("%d",&choice); 
     switch (choice) 
     { 
     case 1: if (isFull(queue) == true) 
       { 
        printf("\nQueue is Full.."); 
        break; 
       } 
       else 
       { 
        printf("\nEnter a number: "); 
        scanf("%d",&item); 
        En_queue(queue,item); 
        Display(queue); 
       } 
       break; 
     case 2: if (isEmpty(queue)== true) 
       { 
        printf("\nQueue is Empty.."); 
        break; 
       } 
       else 
       { 
        item = De_queue(queue); 
        printf("\nItem popped is: %d",item); 
        Display(queue); 
       } 
       break; 
     case 3: Display(queue); 
       break; 
     case 4: exit(0); 
       break; 
     } 

    } 
}