我正在尝试使用代码块来学习C,我的任务的一部分是使用队列作为输入和输出方法。
#include <stdio.h>
#include <stdlib.h>
typedef struct QUEUE {
int head, tail;
int list[4];
} queue;
void create( queue *q ) {
q->head = 0;
q->tail = 0;
}
int empty( queue *q ) {
if ( q->tail == 0 )
return 1;
else
return 0;
}
int full( queue *q ) {
if ( q->tail == 4 )
return 1;
else
return 0;
}
void enqueue( queue *q ) {
int i, data;
if ( full( q ) == 1 )
printf( "\nQueue is Full" );
else {
printf( "\nEnqueue Integer : " );
scanf( "%d", &data );
q->list[q->tail] = data;
q->tail++;
}
}
void dequeue( queue *q ) {
int i;
if ( empty( q ) == 1 )
printf( "\n Queue is Empty" );
else
q->head++;
}
void main( ) {
int select;
queue q;
create( &q );
while ( 1 ) {
printf( "\n1->Enqueue \t 2->Dequeue \t 3->Exit: " );
scanf( "%d", &select );
switch ( select ) {
case 1: enqueue( &q );
break;
case 2: dequeue( &q );
break;
default: goto out;
}
}
out:
exit( EXIT_SUCCESS );
}
这是我的代码,dequeue函数返回队列最初是空的,但在我将一个整数排队后,它根本不会出列。谢谢你的帮助。我正在使用codeblock来编译我的程序。
答案 0 :(得分:0)
好的,根据您的评论,当您将其地址传递到queue
函数时,您似乎希望重置dequeue
。这将是一种肤浅的答案,但为什么不在必要时将q->tail
重置为0
函数内的dequeue
?
void dequeue( queue *q ) {
int i;
if ( ... )
printf( ... );
else
q->tail = 0; // <-- changed this
}
结构中的head
属性似乎根本没用,至少目前是这样。
答案 1 :(得分:0)
队列是FIFO(先进先出),你有一个固定大小的FIFO(4个整数)以及一个指向头部和尾部的“指针”。
查看代码时,tail
指向下一个可用空间,而head
指向第一个填充空间。
当您enqueue
添加值并在tail
中增加值时。
当您dequeue
增加head
中的值时。
这是可以的,除了head
和tail
应该是数组的索引。绝不会减少存储在其中的值。这意味着一旦您向队列添加了4个值,就永远不能再添加。
您还假设tail == 0
时列表为空,但如果head == tail
和head == 1
,根据您的代码,在这种情况下列表为空,但empty
1}}函数不会知道它是空的。
由于您没有使用动态内存,我会完全删除head
变量。
当你dequeue
时,我会将内部数组中的值移动到上一个索引中。因此list[1]
被放入list[0]
。然后递减tail
。
答案 2 :(得分:0)
在struct QUEUE中创建一个新的变量大小,在创建队列时初始化为0,并引用存储在队列中的数据量。
typedef struct QUEUE {
int head, tail,size;
int list[4];
} queue;
void create( queue *q ) {
q->head = 0;
q->tail = -1;
q->size=0;
}
因此,大小0表示队列中不存在数据,大小4表示队列已满。
int empty( queue *q ) {
if ( q->size==0 )
return 1;
else
return 0;
}
int full( queue *q ) {
if ( q->size==4)
return 1;
else
return 0;
}
当您将数据排入队列时,大小会增加1,当您将数据出列时,大小会减少1。
void enqueue( queue *q ) {
int i, data;
if ( full( q ) == 1 )
printf( "\nQueue is Full" );
else {
printf( "\nEnqueue Integer : " );
scanf( "%d", &data );
q->tail++;
q->size++;
if(q->tail==4){
q->tail=0;
}
q->list[q->tail] = data;
if(tail==4){
q->tail==0;
}
}
}
void dequeue( queue *q ) {
int i;
if ( empty( q ) == 1 )
printf( "\n Queue is Empty" );
else{
q->head++;
q->size--;
}
}
注意 - 您的代码缺少循环队列流。当tail已越过分配的最后一块内存时,它应该到达第一个块。
所以,我们在enqueue函数中添加了这个:
if(tail==4){
q->tail==0;
}