出列功能不起作用

时间:2014-04-20 12:53:23

标签: c queue

我正在尝试使用代码块来学习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来编译我的程序。

3 个答案:

答案 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中的值时。

这是可以的,除了headtail应该是数组的索引。绝不会减少存储在其中的值。这意味着一旦您向队列添加了4个值,就永远不能再添加。

您还假设tail == 0时列表为空,但如果head == tailhead == 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;
            }