2017-09-13 4 views
0

Le code montre les opérations de base sur la file d'attente circulaire.Opérations de file d'attente circulaires à l'aide d'une baie

#define maxsize 10 
typedef struct queue 
{ 
    int data[maxsize]; 
    int f,r; 
}myQueue; 
myQueue q; 

void init(myQueue *q); 
int full(myQueue *q); 
int empty(myQueue *q); 
void enqueue(myQueue *q,int num); 
void dequeue(myQueue *q); 
void print(myQueue *q); 

void main() 
{ 
    init(&q); 
    int op; 
    do 
    { 
     printf("\nCircular queue operations: Press:\n"); 
     printf("1 for enqueue\n"); 
     printf("2 for dequeue\n"); 
     printf("3 to print Circular Queue\n"); 

     int num,choice; 
     printf("\nEnter choice:\n"); 
     scanf("%d",&choice); 
     switch(choice) 
     { 
      case 1: printf("Enter number to insert :\n"); 
        scanf("%d",&num); 
        if(full(&q)) 
        { 
         printf("\nQueue is full\n"); 
         exit(0); 
        } 
        enqueue(&q,num); 
        break; 
      case 2: if(empty(&q)) 
        { 
         printf("\nQueue is empty\n"); 
         exit(0); 
        } 
        dequeue(&q); 
        break; 
      case 3: printf("Printing current queue: \n"); 
        print(&q); 
        break; 
      default:break; 
     } 
     printf("Press 1 to continue or 0 to exit:\n"); 
     scanf("%d",&op); 
    } 
    while(op); 
} 

void init(myQueue *q) 
{ 
    q->f=-1; 
    q->r=-1; 
} 

int full(myQueue *q) 
{ 
    if((q->r+1)%maxsize==q->f) 
    { 
     return 1; 
    } 
    else 
     return 0; 
} 

int empty(myQueue *q) 
{ 
    if(q->r==-1) 
    { 
     return 1; 
    } 
    else 
     return 0; 
} 

fonction enqueue est utilisé pour ajouter des éléments dans la file d'attente.

void enqueue(myQueue *q,int num) 
{ 
    if(empty(&q)) 
    { 
     q->f=0; 
     q->r=0; 
    } 
    else 
    { 
     q->r=(q->r+1)%maxsize; 
    } 
    q->data[q->r]=num; 
    printf("\n%d is enqueued\n",q->data[q->r]); 
} 

fonction Dequeue est utilisé pour supprimer des éléments de la pile.

void dequeue(myQueue *q) 
{ 
    int del_num; 
    del_num=q->data[q->f]; 
    if(q->f==q->r) 
    { 
     init(&q); 
    } 
    else 
    { //To move front to the next position in the circular array. 
     q->f=(q->f+1)%maxsize; 
    } 
    printf("\n%d is dequeued\n",del_num); 
} 

void print(myQueue *q) 
{ 
    int i; 
    for(i=q->f;i!=q->r;i=(i+1)%maxsize) 
    { 
     printf("%d\n",q->data[i]); 
    } 
    printf("%d\n",q->data[q->r]); 
} 

Issue: file d'attente circulaire est mise en attente automatiquement l'élément 0 dans ce premier temps. Cependant, le reste des opérations fonctionnent correctement.

Je ne suis pas en mesure d'identifier, pourquoi il insère automatiquement 0 dans la file d'attente circulaire, sans que je l'ai mis en file d'attente.

+2

S'il y a un problème avec la façon dont vous initialisez la file d'attente, nous aurions besoin de voir la fonction 'init' qui fait cela? –

+0

Oui, la fonction init initialise l'avant et l'arrière de la file d'attente avec -1. Je ne pouvais pas trouver ce qui ne va pas. Une petite aide serait appréciée. @ChrisTurner – AspiringCoderNeo

Répondre

0

1er Code Snippet nécessitant le changement:

void enqueue(myQueue *q,int num) 
{ 

La ligne ci-dessous est modifiée.

if(empty(q)==1) 
    { 
     q->f=0; 
     q->r=0; 
    } 
    else 
    { 
     q->r=(q->r+1)%maxsize; 
    } 
q->data[q->r]=num; 
printf("\n%d is enqueued\n",q->data[q->r]); 
} 

2ème extrait de code modifié exigeant:

void dequeue(myQueue *q) 
{ 
    int del_num; 
    del_num=q->data[q->f]; 
    if(q->f==q->r) 
    { 

ligne ci-dessous est modifiée.

init(q); 
    } 
    else 
    { //To move front to the next position in the circular array. 
    q->f=(q->f+1)%maxsize; 
    } 
    printf("\n%d is dequeued\n",del_num); 
} 

3ème extrait nécessitant le changement:

void print(myQueue *q) 
{ 
    int i; 

ligne ci-dessous est modifiée.

if(empty(q)) 
    { 
    printf("Queue empty"); 
    exit(0); 
    } 
    else 
    { 
    printf("Printing current queue: \n"); 
    for(i=q->f;i!=q->r;i=(i+1)%maxsize) 
    { 
    printf("%d\n",q->data[i]); 
    } 
    printf("%d\n",q->data[q->r]); 
    } 
} 

qui le rend parfaitement bien. :)

1

La fonction print() imprime toujours q->data[q->r] comme dernière opération. Cela n'a aucun sens lorsque votre file d'attente est vide. Peut-être vous pouvez l'éviter comme ceci:

void print(myQueue *q) 
{ 
    if (empty(q)) 
     return; 

    int i; 
    for(i=q->f;i!=q->r;i=(i+1)%maxsize) 
    { 
     printf("%d\n",q->data[i]); 
    } 
    printf("%d\n",q->data[q->r]); 
} 

Quoi qu'il en soit il y a beaucoup plus de problèmes avec votre code, je doute qu'il compile correctement. Juste à titre d'exemple, la fonction enqueue() reçoit un paramètre de type myQueue*. Ensuite, il fournit une fonction vide avec l'adresse de celui-ci, mais c'est faux. vous devez passer la fonction le pointeur lui-même, donc q au lieu de &q. La même erreur est répétée encore et encore.

+0

Merci @CostantinoGrana. C'était le problème ", passez la fonction le pointeur lui-même, donc q au lieu de & q". Maintenant, le problème est complètement résolu et fonctionne bien. – AspiringCoderNeo

+0

@AspiringCoderNeo, si la réponse est utile, marquez-la comme telle, afin que les autres personnes soient averties. –