当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?
Posted
技术标签:
【中文标题】当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?【英文标题】:How to check if the first entry of an array of entries is empty when the array is of type struct in C?当数组是C中的struct类型时,如何检查条目数组的第一个条目是否为空? 【发布时间】:2021-12-25 01:08:05 【问题描述】:我必须为 Uni 编写一个程序,其中应该有一个具有优先级的队列,并且在队列中应该有一个条目数组,每个条目需要 31 个字符。还需要一个函数来检查队列是空的还是满的。我已经编写了这段代码,但它不起作用,我得到错误 invalid oprands to binary == (have entry and '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 替换为 NULL,但这也不起作用,我将非常感谢任何帮助!非常感谢!!
Ps:我还必须稍后编写一个函数,其中第一个条目被打印和删除,而所有其他 etries 在队列中“向上”移动 1,我不知道如何实现它。如果有人有想法,非常感谢!
【问题讨论】:
您可能希望size
与 capacity
分开,(固定为 10。)并非所有 10 个项目都始终是满的,因此您必须有一个 size
in你的pqueue
。
旁白:那是return 1;
还是return l;
?请避免使用看起来像数字的名称,您会使代码更难阅读,容易混淆和出错。知道代码中使用了l
,每次看到1
,我都必须仔细眯起眼睛,确保它不是l
,失去了对大局的关注。
即返回 1(真)。我明白你在说什么,但不幸的是我有一些变量和函数名称,因为我不允许更改
优先级队列的规范实现是堆。事实上,这些术语有时可以互换使用(但现在更少了)。
此外,C 数组永远不会为空。可能它们的元素都不包含对程序目的很重要的数据,但这是完全不同的事情:元素存在,但您想忽略它们。要跟踪这一点,您需要一个外部指标来指示哪些/多少元素包含有效数据,或者您需要元素本身支持一个您可以通过编程识别为指示“无数据”的值。
【参考方案1】:
pqueue
是函数isEmpty
中的一个指针,它指向一个条目数组。您正在访问数组条目,当您编写pqueue->entries[0]
时,您正在访问类型为entry
的元素,但这不是检查它是否为NULL
的指针!你应该做的是创建一个变量,在结构pqueue
中说下一个告诉你下一个空点在哪里,给它一个初始值-1
,你会检查它是否-1
,然后是你的队列为空,以此类推,添加元素时,在添加之前将其加 1。
【讨论】:
非常感谢,这对您有很大帮助!!还有一个问题,为什么建议使用 -1 而不是 0 来初始化 count 变量? 没有理由,但由于您要创建队列,实际上需要 2 个变量,一个用于前面,另一个用于后面! 你这是什么意思?什么前,什么后?我知道在 pqueue 结构内实现了一个 queuelength 变量。我还缺少什么?以上是关于当数组是C中的struct类型时,如何检查条目数组的第一个条目是不是为空?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 将struct数组传递给另一个struct的init
c struct queue error:“数组类型具有不完整的元素类型”