#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
это используется в коде , каждый раз, когда я вижу a1
, я должен внимательно прищуриться, чтобы убедиться, что это не так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. что еще я упускаю?