Прежде всего, вы получаете эту ошибку, потому что front
не определено в этом контексте, это свойство объекта очереди. Попробуйте вместо этого использовать queue->front
.
Несмотря на это, queue->no_of_lines
определяется как int и не является массивом, поэтому вы не можете получить доступ к элементам по индексу для этого.
Насколько я понял, вы реализуете FILO ( Очередь в порядке очереди) верно?
Итак, прежде всего, когда вы делаете это struct Queue* queue = createQueue(1000);
, вы пытаетесь создать очередь из 1000 элементов, верно? Что ж, этого не происходит.
Как вы реализовали, вы выделяете байты для структуры Queue, и она также включает в себя свойства front, Rear, Size и Capacity, но их нужно определить только один раз для очередь. Я ожидаю, что вы выделяете память только для элемента struct Fileobject object
. Мое предложение будет следующим:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define NAME_SIZE 32
// A structure to represent a queue
struct Fileobject
{
char file_name[NAME_SIZE];
time_t last_updated;
int no_of_lines;
long int file_size;
};
struct Queue
{
int front, rear, size;
unsigned capacity;
struct Fileobject* objects;
};
// function to create a queue of given capacity.
// It initializes size of queue as 0
void createQueue(struct Queue queue, unsigned capacity)
{
struct Queue queue = (struct Queue*) malloc(sizeof(struct Queue));
queue->capacity = capacity;
queue->front = queue->size = 0;
queue->rear = capacity - 1; // This is important, see the enqueue
queue->objects = (struct Fileobject*) malloc(capacity*sizeof(struct Fileobject));
//here would be great to have an initiallization procedure to the allocate memory above.
}
int isFull(struct Queue* queue)
{ return (queue->size == queue->capacity); }
int isEmpty(struct Queue* queue)
{ return (queue->size == 0); }
// Function to add an item to the queue.
void enqueue(struct Queue* queue, char* file_name, time_t last_updated, int no_of_lines, long int file_size)
{
int last_index;
if (isFull(queue))
return;
queue->rear = (queue->rear + 1)%queue->capacity;
last_index = queue->rear + 1;
queue->objects[last_index].file_name = file_name;
queue->objects[last_index].last_updated = last_updated;
queue->objects[last_index].no_of_lines = no_of_lines;
queue->objects[last_index].file_size = file_size;
queue->size = queue->size + 1;
printf("%s enqueued to queue\n", file_name);
}
// Function to remove an item from queue.
char* dequeue(struct Queue* queue)
{
if (isEmpty(queue))
return INT_MIN;
char * filename = queue->objects[queue->front].file_name;
queue->front = (queue->front + 1)%queue->capacity;
queue->size = queue->size - 1;
return filename;
}
struct Queue queue;
int main()
{
createQueue(&queue, 1000);
enqueue(&queue, "/xyz/abc/pqr/book.txt", 3085, 12, 123456756);
printf("%s dequeued from queue\n\n", dequeue(&queue));
return 0;
}
Извините, я не смог проверить, но я попытался представить другую точку зрения и дать вам некоторые идеи.