2017-09-13 112 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]); 
} 

第二代碼段需要改變:以下

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,如果答案很有用,請將其標記爲,以便通知其他人。 –