2017-09-13 11 views
0

コードは、循環キューの基本操作を示します。円キューを使用した円キュー操作

#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; 
} 

エンキュー機能は、キューに要素を追加するために使用されます。

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]); 
} 

デキュー機能は、スタックから要素を削除するために使用されます。

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]); 
} 

問題:循環キューが自動的に最初にそれで0要素をエンキューされます。 しかし、残りの操作は正常に動作しています。

私はそれをエンキューせずに循環キューに0を自動的に挿入する理由を特定できません。

+2

キューを初期化する方法に問題がある場合は、それを行う 'init'関数を確認する必要がありますか? –

+0

はい、init関数は、キューの前後を-1で初期化します。私はそれに何が間違っているのか分からなかった。少しの助けをいただければ幸いです。 @ChrisTurner – AspiringCoderNeo

答えて

0

第一コードスニペットが必要な変更:以下の行が変更された

void enqueue(myQueue *q,int num) 
{ 

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のコード・スニペットは、変更要求:以下

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; 

下の行が変更されます。それは完全に大丈夫になり

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]); 
    } 
} 

。 :)

1

print()は、最後の操作として常にq->data[q->r]を出力します。あなたのキューが空の場合、これは意味をなさない。たぶん、あなたはこのようにそれを避けることができます。

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]); 
} 

は、とにかく、私はそれが正しくコンパイルされて疑うあなたのコードでより多くの問題があります。一例として、関数 enqueue()は、タイプ myQueue*のパラメータを受け取ります。それからそれはそれのアドレスで空の機能を提供しますが、これは間違っています。あなたは &qの代わりに qのようにポインタ自体に関数を渡さなければなりません。同じミスが繰り返し繰り返されます。

+0

ありがとう@CostantinoGrana。これは問題でした。 "ポインタに関数を渡します。したがって、&qの代わりにqを渡します。"今問題は完全に解決され、正常に動作します。 – AspiringCoderNeo

+0

@AspiringCoderNeo、答えが有用な場合は、他の人に通知されるように答えを付けます。 –

関連する問題