C语言使用指针实现一个环形缓冲区结构体内包含数组,能够进行空、满检测完整代码
时间: 2023-07-16 19:15:20 浏览: 91
以下是使用指针实现一个环形缓冲区结构体内包含数组,并且能够进行空、满检测的完整代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 5
typedef struct {
int *buffer;
int size;
int head;
int tail;
} circular_buffer;
void init_buffer(circular_buffer *cb, int size) {
cb->buffer = (int*) malloc(sizeof(int) * size);
cb->size = size;
cb->head = 0;
cb->tail = 0;
}
int is_empty(circular_buffer *cb) {
return (cb->head == cb->tail);
}
int is_full(circular_buffer *cb) {
return ((cb->tail + 1) % cb->size == cb->head);
}
void enqueue(circular_buffer *cb, int data) {
if (is_full(cb)) {
printf("Error: Buffer is full\n");
return;
}
cb->buffer[cb->tail] = data;
cb->tail = (cb->tail + 1) % cb->size;
}
int dequeue(circular_buffer *cb) {
if (is_empty(cb)) {
printf("Error: Buffer is empty\n");
return -1;
}
int data = cb->buffer[cb->head];
cb->head = (cb->head + 1) % cb->size;
return data;
}
void print_buffer(circular_buffer *cb) {
printf("Buffer: ");
if (is_empty(cb)) {
printf("Empty\n");
return;
}
int i = cb->head;
while (i != cb->tail) {
printf("%d ", cb->buffer[i]);
i = (i + 1) % cb->size;
}
printf("\n");
}
int main() {
circular_buffer cb;
init_buffer(&cb, BUFFER_SIZE);
enqueue(&cb, 10);
enqueue(&cb, 20);
enqueue(&cb, 30);
print_buffer(&cb);
dequeue(&cb);
print_buffer(&cb);
enqueue(&cb, 40);
enqueue(&cb, 50);
enqueue(&cb, 60);
print_buffer(&cb);
dequeue(&cb);
dequeue(&cb);
dequeue(&cb);
dequeue(&cb);
dequeue(&cb);
dequeue(&cb);
print_buffer(&cb);
free(cb.buffer);
return 0;
}
```
该代码定义了一个名为 `circular_buffer` 的结构体,其中包含一个整型指针 `buffer`,用于存储缓冲区数据,以及整型变量 `size`,`head`,`tail` 分别表示缓冲区大小、头指针和尾指针。
初始化缓冲区结构体时,使用 `init_buffer` 函数,为 `buffer` 分配内存,并将 `size`、`head` 和 `tail` 的值初始化为 0。
使用 `is_empty` 和 `is_full` 函数分别判断缓冲区是否为空和满。当缓冲区已满时,使用 `enqueue` 函数将新数据添加到缓冲区尾部;当缓冲区为空时,使用 `dequeue` 函数从缓冲区头部删除数据并返回。
`print_buffer` 函数用于打印缓冲区中的所有数据。
在 `main` 函数中,对缓冲区进行了一系列操作,包括添加、删除和打印数据。最后,使用 `free` 函数释放缓冲区内存。
阅读全文