[英]how to print a queue[data structure] in C?
我具有这些结构,我想编写一个主要函数来进行一些测试,但是:1-如何打印此队列? 2-如何更深入地入队? 喜欢,带有“ for”?
我不是想在这里回答作业(在有人这样说之前)。 我有一个测试,所以我只是想学习如何做,如果有人可以帮助我,我将非常感激。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10
typedef struct Queue{
int size;
int first;
int last;
int items[MAX_SIZE];
} Queue;
Queue* createQueue() {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->size = 0;
queue->first = 0;
queue->last = MAX_SIZE - 1;
return queue;
}
Enqueue(Queue *queue, int item) {
if(queue->size >= MAX_SIZE) {
printf("Queue is full!");
}
else {
queue->last = (queue->last + 1) % MAX_SIZE;
queue->items[queue->last] = item;
queue->size++;
}
}
Dequeue(Queue *queue) {
if(queue->size <= 0) {
printf("Queue is empty!");
}
else {
queue->first = (queue->first + 1) % MAX_SIZE;
queue->size--;
}
}
int main {
int i;
Queue *queue = createQueue();
Enqueue(queue, 1);
Enqueue(queue, 5);
Enqueue(queue, 8);
Enqueue(queue, 9);
for(i = 0; i <= MAX_SIZE; i++) { // Is this "for" right?
printf("%d ", queue-> ????) // Don't know what to put here to print right
}
return 0;
}
由于您正在使用数组,因此可以按照以下步骤进行操作:
for ( int i = 0; i < queue->size; i++ ) {
printf( "item at position %d is %d\n", i, queue->items[ i ] );
}
但是,重要的是,队列的实现实际上有一些错误。 您应该在Enqueue
函数中增加队列的大小(不是)。 要解决此问题,请在else
条件的某处添加以下else
:
queue->size += 1;
...此外,您还应该减小Dequeue
函数的大小,方法如下:
queue->size -= 1;
...此外,根据实现队列的方式,当创建队列时,该队列应该为空,因此正反是NULL指针(如果使用链接列表),因此对于数组,应为-1,以表示一个空队列。 您的createQueue
函数应如下所示:
Queue* createQueue() {
Queue *queue = (Queue*)malloc(sizeof(Queue));
queue->size = 0;
queue->first = -1;
queue->last = -1;
return queue;
}
...进行更改将迫使您更改Enqueue
和Dequeue
函数以分别正确处理空队列。 另外,您应该创建一个destroyQueue
函数来清理您分配的所有内存(在这种情况下只有一次)。 总而言之,需要更改很多才能使此队列正常工作。 由于这是一项家庭作业,因此我将由您自己决定。
替代工具:
我建议您探索如何使用动态数组或链表实现队列。 使用固定大小的数组实际上是没有用的……(但要介绍一下)。 探索“动态”内存分配和内存池,或更常见的称为堆。
不过干得好,我希望你正在学习!
/*Affichage*/
void affiche(struct file* f)
{
int j;
int taille=(f->ar-f->av)+1;
for(j=f->av; j < taille; j++)
printf("%d \n", f->tab[f->av]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.