Как проверить, пуста ли первая запись массива записей, если массив имеет тип struct в C?

#arrays #c #if-statement #struct

Вопрос:

Я должен написать программу для Uni, в которой должна быть очередь с приоритетом, и в очереди должен быть массив записей, каждая запись которых должна состоять из 31 символа. Также должна быть функция, которая проверяет, пуста или полна очередь. Я написал этот код, но он не работает, я получаю ошибку недопустимые операции в двоичном формате == (есть запись и «int»):

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

enum priority {
    H, h, n, l, L      //Priority enum Highest = 0 Lowest = 4
};

typedef struct entry{
    enum priority priorityvar;
    char message[31];
} entry;

typedef struct pqueue {
    entry entries[10];
} pqueue;

int isEmpty(pqueue* pqueue){
    if (pqueue->entries[0] == 0)
        return 1;
    else
        return 0;
}
int isFull(pqueue* pqueue){
    if (pqueue->entries[9] != 0)
        return 1;
    else
        return 0;
}
 

Я также попытался заменить 0 на НОЛЬ, но это тоже не сработало, я был бы так благодарен за любую помощь! Большое вам спасибо!!

Ps: Позже мне также придется написать функцию, в которой первая запись печатается и удаляется, в то время как все остальные попытки перемещаются на 1 «вверх» в очереди, и я понятия не имею, как это реализовать. Если у кого-то есть идеи, большое вам спасибо!!

Комментарии:

1. Вы, вероятно, хотите size , чтобы он был отделен от capacity , (что исправлено, 10.) Не все 10 предметов всегда заполнены, поэтому у вас должно быть size в вашем pqueue .

2. В сторону: это return 1; было или return l; ? Пожалуйста, избегайте использования имен, которые выглядят как цифры, вы усложните чтение кода, его будет легко спутать и ошибиться. Зная, что l это используется в коде , каждый раз, когда я вижу a 1 , я должен внимательно прищуриться, чтобы убедиться, что это не так l , теряя фокус на более широкой картине.

3. Это возвращает 1 (True). Я понимаю, о чем вы говорите, но, к сожалению, у меня есть некоторые переменные и имена функций, которые мне запрещено изменять

4. Каноническая реализация приоритетной очереди-это куча. На самом деле, эти термины иногда используются взаимозаменяемо (но в наши дни это не так).

5. Кроме того, массивы C никогда не бывают пустыми. Возможно, ни один из их элементов не содержит данных, значимых для целей программы, но это совершенно другое дело: элементы существуют, но вы хотите их игнорировать. Чтобы отследить это, вам нужен либо внешний индикатор того, какие / сколько элементов содержат допустимые данные, либо вам нужны сами элементы для поддержки значения, которое вы можете программно распознать как указывающее «нет данных».

Ответ №1:

pqueue является указателем в функции isEmpty , он указывает на массив записей. Вы обращаетесь к записям массива, когда вы пишете pqueue->entries[0] , вы обращаетесь к элементу типа entry , но это не указатель, чтобы проверить, так ли это NULL ! Что вам нужно сделать, так это создать переменную, скажем , далее в структуре pqueue , которая сообщает вам, где находится следующее пустое место, укажите ей начальное значение -1 , и вы проверите, пуста ли она -1 , затем ваша очередь и так далее, при добавлении элемента увеличьте ее на 1, прежде чем добавлять.

Комментарии:

1. Большое вам спасибо, это очень помогло!! Еще один вопрос: почему вы рекомендуете инициализировать переменную count с помощью -1, а не 0?

2. Нет никакой причины, но так как вы пытаетесь создать очередь, вам на самом деле понадобятся 2 переменные, одна для передней, а другая для задней!

3. Что вы имеете в виду под этим? Какой фронт и какой тыл? Я знаю, что реализовал переменную длины очереди внутри структуры pqueue. что еще я упускаю?