无法在C中实现队列

时间:2015-02-22 18:16:34

标签: c queue

我试图在c中实现队列。我已经在我的代码中实现了一个enqueue函数。但是,当我测试它时,我没有得到所需的输出。有人可以告诉我我做错了吗?

struct queue{

     int array[30];
     int *front; //pointer to front of queue
     int *rear;  //pointer to rear of queue

     int count; //counts number of elements in queue
 };

//初始化队列

struct queue * new_Queue()
{

     struct queue *q;
     q->count=0;
     q->front=&q->array[-1];
     q->rear=&q->array[-1];

     return q;
};

int queueCount(struct queue *q)
{
     return q->count;
}

int isFull(struct queue *q)
{
     if(q->count==30){
         printf("%s","Buffer is full!");
         return 1;
     }

return 0;
}

int isEmpty(struct queue *q)
{

     if(q->count==0){
         printf("%s","Queue is empty!");
         return 1;
     }
return 0;
}



int enqueue(struct queue * q,int i)
{

     if(isFull(q)){
         return 0;
     }

     if(isEmpty(q)){
         q->front+1;

     }

     int k=*(q->rear+1);

     q->array[k]=i;
     printf("enque success!");


     return 1;
}

int main(int argc, char**argv)
{
     int i=10;

     struct queue *newQueue;

     enqueue(newQueue,i);
     int j= queueCount(newQueue);
     printf("%d",j);

}

1 个答案:

答案 0 :(得分:0)

你的队列需要内存。此时,您有一个未初始化的指针指向内存中的随机位置。取消引用该指针是未定义的行为,很可能会给你一个seg错误。

您必须决定如何存储队列。您可以使用malloc在堆上分配它。这是您的函数new_Queue应该执行的操作:

struct queue *new_Queue()
{
    struct queue *q = malloc(sizeof(*q));    // TO DO: Error checking

    q->count = 0;
    q->front = q->array;
    q->rear = q->array;

    return q;
}

您的客户端代码如下所示:

struct *q = new_Queue();

enqueue(q, x);
// Do more stuff ...

free(q);     // Release resources

队列结构不大。您也可以在堆栈上分配它。在那种情况下,你需要一个初始化函数:

void queue_init(struct queue *q)
{
    q->count = 0;
    q->front = q->array;
    q->rear = q->array;
}

并称之为:

struct queue *q;

queue_init(&q);
enqueue(&q, 12);

注意addres-of运算符&。您不必(也不能)free这里的队列。

您无法在索引-1访问数组。您可以将前面的元素设为队列,然后将后点指向下一个元素入队的空间。在循环缓冲区中,这将使空列表和完整列表不可分割,但您可以使用count来区分它们。