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

编译C程序报错:enqueue与dequeue存在类型冲突

问题分析与修复方案

1. 函数声明的结构体前置声明问题

你在顶部声明enqueue和dequeue函数时,struct Queue和struct People还未定义,编译器无法识别这两个结构体类型,导致函数声明与后续定义的类型不匹配,触发类型冲突错误。

解决方法:在函数声明前添加结构体前置声明,提前告知编译器这两个结构体的存在。

2. 链表节点缺失next指针

struct People结构体中没有next指针成员,但你在enqueue和dequeue函数中使用了queue->tail->next和people->next,这会导致编译错误。需要为struct People添加指向自身类型的指针成员,用于构建链表结构。

3. struct Queue的冗余成员

struct Queue中的struct People next是多余的,队列只需维护链表的头指针(front)、尾指针(tail)和队列大小(size)即可,该成员可直接删除。


修复后的完整代码

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

// 结构体前置声明,让编译器知晓结构体存在
struct People;
struct Queue;

// Queue 函数声明
void enqueue(struct Queue *, struct People *);
struct People *dequeue(struct Queue *);

struct People {
    int peopleID;
    int arrivalTime;
    struct People *next; // 添加链表节点的next指针
};

struct Queue {
    struct People *front;
    struct People *tail;
    int size; // 删除冗余的next成员
};

void enqueue(struct Queue *queue, struct People *people) {
    // 初始化新节点的next为NULL,避免野指针
    people->next = NULL;
    
    if (queue->size == 0) {
        queue->front = people;
        queue->tail = people;
    } else {
        queue->tail->next = people;
        queue->tail = people;
    }
    queue->size++;
}

struct People *dequeue(struct Queue *queue) {
    if (queue->size == 0) {
        return NULL;
    } else {
        struct People *people = queue->front;
        queue->front = people->next;
        // 队列只剩最后一个元素时,出队后tail需置为NULL
        if (queue->size == 1) {
            queue->tail = NULL;
        }
        queue->size--;
        return people;
    }
}

int main(int argc, char *argv[]) {
    // 示例:初始化队列、创建节点并执行入队出队操作
    struct Queue queue = {NULL, NULL, 0};
    
    struct People *p1 = malloc(sizeof(struct People));
    p1->peopleID = 1;
    p1->arrivalTime = 10;
    
    struct People *p2 = malloc(sizeof(struct People));
    p2->peopleID = 2;
    p2->arrivalTime = 20;
    
    enqueue(&queue, p1);
    enqueue(&queue, p2);
    
    struct People *out = dequeue(&queue);
    if (out) {
        printf("出队人员ID:%d,到达时间:%d\n", out->peopleID, out->arrivalTime);
        free(out); // 释放内存,避免泄漏
    }
    
    out = dequeue(&queue);
    if (out) {
        printf("出队人员ID:%d,到达时间:%d\n", out->peopleID, out->arrivalTime);
        free(out);
    }
    
    return 0;
}

额外注意事项

  • 入队时必须将新节点的next置为NULL,防止出现野指针。
  • 出队队列仅剩最后一个元素时,要同步将tail置为NULL,避免tail指向已出队的无效节点。
  • 用malloc分配的节点,出队后务必用free释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:15:35