/*
*
* 循环队列实现
* chenbdchenbd@gmail.com
*/
#include <stdio.h>
#include <memory.h>
#define RING_BUF_LEN (5)
#define RING_BUF_OK (0x00)
#define RING_BUF_NG (0xff)
#define RING_BUF_INVALID_IDX (-1)
#ifdef _DEBUG
#define RING_BUF_DEBUG(x) x
#else
#define RING_BUF_DEBUG(x)
#endif
typedef struct
{
int i_head;
int i_tail;
int i_buf[RING_BUF_LEN];
}S_RING_BUF_t;
S_RING_BUF_t st_ring_buf;
int ring_buf_init(S_RING_BUF_t* ring_buf)
{
int i_ret = RING_BUF_NG;
if (NULL != ring_buf)
{
ring_buf->i_head = ring_buf->i_tail = RING_BUF_INVALID_IDX;
memset(ring_buf->i_buf, 0x00, sizeof(ring_buf->i_buf));
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf: i_head = %08x, i_tail = %08x/n",ring_buf->i_head, ring_buf->i_tail));
}
return i_ret;
}
int ring_buf_insert(S_RING_BUF_t* ring_buf, int i_val)
{
int i_ret = RING_BUF_NG;
if (NULL != ring_buf)
{
if (RING_BUF_INVALID_IDX == ring_buf->i_head)
{
ring_buf->i_head = ring_buf->i_tail = 0;
ring_buf->i_buf[ring_buf->i_head++] = i_val;
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf: i_head = %08x, i_tail = %08x/n",ring_buf->i_head, ring_buf->i_tail));
}
else
{
if (((ring_buf->i_head + 1) % RING_BUF_LEN) != ring_buf->i_tail)
{
ring_buf->i_buf[ring_buf->i_head] = i_val;
ring_buf->i_head = ((ring_buf->i_head + 1) < RING_BUF_LEN) ? (ring_buf->i_head + 1) : /
((ring_buf->i_head + 1) % RING_BUF_LEN);
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf: i_head = %08x, i_tail = %08x/n",ring_buf->i_head, ring_buf->i_tail));
}
else
{
RING_BUF_DEBUG(printf("ring_buf:buf is full!!!/n"));
}
}
}
return i_ret;
}
int ring_buf_del(S_RING_BUF_t* ring_buf, int* i_out)
{
int i_ret = RING_BUF_NG;
if (NULL != ring_buf)
{
if (RING_BUF_INVALID_IDX != ring_buf->i_tail)
{
if (ring_buf->i_tail != ring_buf->i_head)
{
if (NULL != i_out)
{
*i_out = ring_buf->i_buf[ring_buf->i_tail];
ring_buf->i_tail = ((ring_buf->i_tail + 1) < RING_BUF_LEN) ? (ring_buf->i_tail + 1) : /
((ring_buf->i_tail + 1) % RING_BUF_LEN);
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf: i_head = %08x, i_tail = %08x/n",ring_buf->i_head, ring_buf->i_tail));
}
}
else
{
RING_BUF_DEBUG(printf("ring_buf:buf is empty!!!/n"));
}
}
else
{
RING_BUF_DEBUG(printf("ring_buf:buf is empty!!!/n"));
}
}
return i_ret;
}
int ring_buf_empty(S_RING_BUF_t* ring_buf)
{
int i_ret = RING_BUF_NG;
if (NULL != ring_buf)
{
if (ring_buf->i_tail == ring_buf->i_head)
{
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf:buf is empty!!!/n"));
}
}
return i_ret;
}
int ring_buf_full(S_RING_BUF_t* ring_buf)
{
int i_ret = RING_BUF_NG;
if (NULL != ring_buf)
{
if (((ring_buf->i_head + 1) % RING_BUF_LEN) == ring_buf->i_tail)
{
i_ret = RING_BUF_OK;
RING_BUF_DEBUG(printf("ring_buf:buf is full!!!/n"));
}
}
return i_ret;
}
int main (void)
{
int i_tmp;
ring_buf_init(&st_ring_buf);
ring_buf_insert(&st_ring_buf, 1);
ring_buf_insert(&st_ring_buf, 2);
ring_buf_insert(&st_ring_buf, 3);
ring_buf_insert(&st_ring_buf, 4);
ring_buf_insert(&st_ring_buf, 5);
ring_buf_full(&st_ring_buf);
ring_buf_del(&st_ring_buf, &i_tmp);
ring_buf_del(&st_ring_buf, &i_tmp);
ring_buf_del(&st_ring_buf, &i_tmp);
ring_buf_del(&st_ring_buf, &i_tmp);
ring_buf_del(&st_ring_buf, &i_tmp);
ring_buf_empty(&st_ring_buf);
return 0;
}
循环队列
最新推荐文章于 2024-06-17 00:00:00 发布