C语言中,用链表写一个队列,队列的最大长度为10,每次入队需要查询一下当前队列有相同的case的数量是否大于3,若没有则入队,若有相同的那么就不进行此次入队。出队作出移除操作。若队列长度超过10,后续不再入队。
时间: 2024-10-17 17:11:32 浏览: 16
在C语言中,我们可以使用结构体和指针来创建一个具有限制的队列。这里我们定义一个`Queue`结构体,包含一个数组作为存储元素、两个指针分别表示头和尾,并设置一个计数器`count`用于跟踪同类型的元素数量。以下是关键部分的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
typedef struct Queue {
Node* head;
Node* tail;
int count;
const int maxLength;
} Queue;
// 初始化队列
Queue* createQueue(int maxLen) {
Queue* queue = (Queue*)malloc(sizeof(Queue));
queue->head = NULL;
queue->tail = NULL;
queue->count = 0;
queue->maxLength = maxLen;
return queue;
}
// 入队操作
void enqueue(Queue* q, int value) {
if (q->count >= q->maxLength || value == q->head->data) return; // 同类型的元素数量超过3
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (q->head == NULL) { // 队列为空
q->head = newNode;
q->tail = newNode;
} else {
q->tail->next = newNode;
q->tail = newNode;
}
q->count++;
}
// 出队操作
int dequeue(Queue* q) {
if (q->head == NULL) return -1; // 队列为空
int data = q->head->data;
Node* temp = q->head;
q->head = q->head->next;
free(temp); // 释放头部节点内存
if (q->head != NULL) {
q->count--;
} else {
q->tail = NULL;
}
return data;
}
// 清空并销毁队列
void destroyQueue(Queue* q) {
Node* curr = q->head;
while (curr != NULL) {
Node* next = curr->next;
free(curr);
curr = next;
}
free(q);
}
int main() {
Queue* queue = createQueue(10);
// 使用enqueue和dequeue方法...
destroyQueue(queue);
return 0;
}
```
在这个实现中,`enqueue()`函数首先检查队列是否已满以及新元素是否与队首元素相同。如果满足条件,则不会入队。`dequeue()`函数从队首移除元素并更新计数。
注意,这个例子是一个简化版本,实际应用可能还需要添加错误处理和其他辅助函数。
阅读全文