编译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
相关产品推荐
相关产品推荐

