首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问一个队列的有关问题

2012-03-16 
请教一个队列的问题各位,晚上好。我写了一段队列的代码,可是不能实现队列的入队,总是显示队列为空。希望各位

请教一个队列的问题
各位,晚上好。我写了一段队列的代码,可是不能实现队列的入队,总是显示队列为空。希望各位帮忙解决一下,代码如下:
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,对实参没有产生影响,故而对于实参来说,并没有任何的操作发生,自然仍是空队列
[解决办法]

探讨
这是一个传值问题

[解决办法]
可以传引用(如果支持的话),这样形参和实参是同一个实体(可以搜索一下相关资料)

或者传递地址(即指针),通过指针访问地址也可以,具体实现可以参考你贴的后面的程序
[解决办法]
是的,出队和入队都是参数有问题,将Q改为*Q,使用指针实现,才可以,可以参考陈锐的《零基础学数据结构》,机械工业,队列一章,里面讲的很详细。
[解决办法]
等于说,形式参数的Q与实际参数是两个东西,所以并没有改变main函数中的queue,

热点排行