Реализация очереди с использованием объекта пользовательской структуры в C - PullRequest
1 голос
/ 29 февраля 2020

Я создал две структуры. Я хочу положить sh и вставить объект одной структуры в другую, которая будет вести себя как очередь. Это мой код ниже -

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

// A structure to represent a queue 

size_t bufsize = 32;
struct Fileobject 
{
        char* file_name;
        time_t  last_updated;
        int   no_of_lines;
        long int   file_size;
};

struct Queue 
{ 
        int front, rear, size; 
        unsigned capacity; 
        struct Fileobject object;
}; 

// function to create a queue of given capacity. 
// It initializes size of queue as 0 
struct Queue* createQueue(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->object.file_name = malloc(bufsize * sizeof(char*));
        queue->object.last_updated = 0;
        queue->object.no_of_lines = 0;
        queue->object.file_size = 0;
        return queue; 
} 

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) 
{ 
        if (isFull(queue)) 
                return; 
        queue->rear = (queue->rear + 1)%queue->capacity; 
        queue->object.file_name = file_name;
        queue->object.last_updated = last_updated;
        queue->object.no_of_lines = no_of_lines;
        queue->object.file_size = file_size;
        queue->size = queue->size + 1; 
        printf("%s enqueued to queue\n", queue->object.file_name); 
} 

// Function to remove an item from queue. 
int dequeue(struct Queue* queue) 
{ 
        if (isEmpty(queue)) 
                return INT_MIN; 
        int lineNumber = queue->object.no_of_lines[front];
        queue->front = (queue->front + 1)%queue->capacity; 
        queue->size = queue->size - 1; 

} 
int main() 
{ 
        struct Queue* queue = createQueue(1000); 

        enqueue(queue, "/xyz/abc/pqr/book.txt", 3085, 12, 123456756); 
         printf("%c dequeued from queue\n\n", dequeue(queue)); 


        return 0; 
} 

Здесь я могу поставить объект в очередь, но не могу удалить его из очереди. Например, я хочу извлечь no_of_lines из функции dequeue. Но я получаю сообщение об ошибке, как показано ниже -

error: ‘front’ undeclared (first use in this function)
         int lineNumber = queue->object.no_of_lines[front];

Может кто-нибудь сказать мне, что не так с моим кодом?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 февраля 2020

Прежде всего, вы получаете эту ошибку, потому что 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; 
} 

Извините, я не смог проверить, но я попытался представить другую точку зрения и дать вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...