You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中struct结构体数组构成的优先级队列如何判断空满及出队?

报错原因

你编写的空满判断函数出现类型不匹配报错,是因为entries数组的元素是自定义entry结构体类型,C语言本身不支持结构体直接和整数0、空指针NULL做相等比较,操作数类型不符合==运算符的要求,编译阶段就会抛出该错误。

空满判断的解决方法

你当前的队列结构没有记录有效元素状态的标识,可选以下两种方案修复:

  • 方案1(推荐):给pqueue结构体新增size成员记录当前队列的有效元素个数,空满判断直接基于size实现,逻辑最简单不易出错。
    修改后的参考代码如下:
typedef struct pqueue {
    entry entries[10];
    int size; // 新增成员,记录队列内有效元素数量
} pqueue;

// 队列初始化函数,使用队列前必须调用一次
void initQueue(pqueue* q) {
    q->size = 0;
    memset(q->entries, 0, sizeof(q->entries));
}

int isEmpty(pqueue* q){
    return q->size == 0;
}
int isFull(pqueue* q){
    return q->size == 10;
}
  • 方案2:不修改队列结构,约定entry的priorityvar为非法值(可在枚举中新增INVALID = 5)时代表该位置为空,判断时直接读取成员值比较即可。
出队功能实现思路

按照你的需求(打印并删除队首、其余元素前移),实现逻辑如下:

  1. 先调用isEmpty判断队列是否为空,为空直接返回错误提示
  2. 打印队首元素entries[0]的优先级和message内容
  3. 从下标1到size-1遍历有效元素,将每个元素赋值给前一个位置(C语言支持同类型结构体直接赋值,无需逐个拷贝成员)
  4. 将队列有效元素数size减1,可选重置最后一个无效位置的内容避免脏数据

出队参考代码:

int dequeue(pqueue* q) {
    if (isEmpty(q)) {
        printf("队列已空,出队失败\n");
        return -1;
    }
    // 打印队首元素
    printf("出队元素:优先级=%d,消息=%s\n", q->entries[0].priorityvar, q->entries[0].message);
    // 剩余元素依次前移
    for (int i = 1; i < q->size; i++) {
        q->entries[i-1] = q->entries[i];
    }
    q->size--;
    // 可选:清空最后一个无效位置的内容
    q->entries[q->size].priorityvar = 5;
    memset(q->entries[q->size].message, 0, 31);
    return 0;
}

内容的提问来源于stack exchange,提问作者user15967184

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:45:04