2017-09-13 115 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,如果答案很有用,请将其标记为,以便通知其他人。 –