请教一个队列的问题
各位,晚上好。我写了一段队列的代码,可是不能实现队列的入队,总是显示队列为空。希望各位帮忙解决一下,代码如下:
QueueByArr.c
#include <stdio.h>
#include <stdlib.h>
typedef struct queue{
int front;
int rear;
int *Item;
int maxsize;
}Queue;
void Err_msg(char E_str[])
{
printf("%s\n",E_str);
exit(0);
}
Queue QueueInit(int size)
{
Queue Q;
Q.front=Q.rear=0;
Q.maxsize=size;
Q.Item=malloc(size*sizeof(int));
return Q;
}
int QueueEmpty(Queue Q)
{
return Q.front==Q.rear;
}
int QueueFull(Queue Q)
{
return (Q.rear+1)%(Q.maxsize)==Q.front;
}
void EnterQueue(int score,Queue Q)
{
if(QueueFull(Q))
Err_msg("Queue is full!");
else{
Q.Item[Q.rear]=score;
Q.rear=(Q.rear+1)%Q.maxsize;
}
}
int DeleteQueue(Queue Q)
{
int score;
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
else{
score=Q.Item[Q.front];
Q.front=(Q.front+1)%Q.maxsize;
return score;
}
}
void ItemShow(int score)
{
printf("%d",score);
}
void PrintQueue(Queue Q)
{
int flag;
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
for(flag=Q.front;flag!=Q.rear;flag=(flag+1)%Q.maxsize)
ItemShow(Q.Item[flag]);
}
int main(int argc, char *argv[])
{
Queue Q=QueueInit(6);
int score,cont=1,result;
result=QueueEmpty(Q);
printf("%d",result);
while(cont!=0)
{
if(cont==1)
{
printf("\nPlease enter the score:");
scanf("%d",&score);
EnterQueue(score,Q);
printf("\nThe score entered is:");
ItemShow(score);
}
else{
score=DeleteQueue(Q);
printf("\nThe score you deleted is:");
ItemShow(score);
}
printf("\nNow the score are:");
PrintQueue(Q);
printf("\nPlease enter your next choice");
printf("(0 for no,1 for enter,2 for delete)");
scanf("%d",&cont);
}
return 0;
}
执行结果:
1
Please enter the score:8
The score entered is:8
Now the score are:Queue is empty!
估计是EnterQueue()这个函数写得有问题,这段代码是我参考别人的代码写的。别人是将Queue定义为指针类型,因而Q便为指针类型。别人的代码我可以给大家看一下:
queuebyarr.c
#include <stdio.h>
#include <stdlib.h>
typedef char QItem;
typedef struct aque *Queue;
typedef struct aque{
int maxsize;
int front;
int rear;
QItem *queue;
}Aqueue;
void Err_msg(char e_str[])
{
printf("%s",e_str);
exit(0);
}
Queue QueueInit(int size)
{
Queue Q=malloc(sizeof(*Q));
Q->queue=malloc(size*sizeof(QItem));
Q->maxsize=size;
Q->front=Q->rear=0;
return Q;
}
int QueueEmpty(Queue Q)
{
return Q->front==Q->rear;
}
int QueueFull(Queue Q)
{
return (((Q->rear+1)%(Q->maxsize)==Q->front)?1:0);
}
QItem QueueFirst(Queue Q)
{
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
return Q->queue[(Q->front+1)%(Q->maxsize)];
}
QItem QueueLast(Queue Q)
{
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
return Q->queue[Q->rear];
}
void EnterQueue(QItem x,Queue Q)
{
if(QueueFull(Q))
Err_msg("Queue is full.");
Q->queue[Q->rear]=x;
Q->rear=(Q->rear+1)%Q->maxsize;
}
QItem DeleteQueue(Queue Q)
{
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
Q->front=(Q->front+1)%Q->maxsize;
return Q->queue[Q->front];
}
void ItemShow(char x)
{
printf("%c",x);
}
void PrintQueue(Queue Q)
{
int flag=Q->front;
if(QueueEmpty(Q))
Err_msg("Queue is empty!");
else{
while(flag!=Q->rear){
ItemShow(Q->queue[flag]);
flag=(flag+1)%Q->maxsize;
}
}
}
int main(int argc,char *argv[])
{
Queue queue1;
int result,cont=1;
char x;
queue1=QueueInit(6);
result=QueueEmpty(queue1);
printf("%d",result);
while(cont!=0)
{
if(cont==1){
printf("\nPlease enter the char you want to enter the queue:");
scanf("%c",&x);
printf("\nThe char enter the queue is:");
ItemShow(x);
printf("\n");
EnterQueue(x,queue1);
printf("The position of the rear:%d\t",queue1->rear);
printf("The position of the front:%d\t",queue1->front);
}else
{
x=DeleteQueue(queue1);
printf("\nThe char delete from the queue is:");
printf("%d\t",queue1->rear);
ItemShow(x);
}
printf("\nNow the element in the Queue are:");
PrintQueue(queue1);
printf("\nPlease enter your next choice(0 for no,1 for enter,2 for out):");
scanf("%d",&cont);
getchar();
}
return 0;
}
我不明白我的问题出在哪儿?希望各位帮忙解决一下。谢谢。
[解决办法]
这是一个传值问题
[解决办法]
void EnterQueue(int score,Queue Q)
在c语言中,是传值的,故实参和形参是不同实体,只是它们的值一样而已。
由于它们各自是独立变量,所以,在函数中(如EnterQueue)修改了Q,对实参没有产生影响,故而对于实参来说,并没有任何的操作发生,自然仍是空队列
[解决办法]