//顺序环形队列
//特点:
//1)FIFO:元素只能从头部删除,从尾部插入
// --------------------------------------------------------------
// | | 1 | 2 | 3 | 4 | | |
// --------------------------------------------------------------
// front rear
// front:指向当前队列中首个元素
// rear: 指向下一个待插入位置
// 初始化时,均为0
//2)最大能插入的元素个数为:队列大小-1 ,原因是为了区分队列满和队列空
//3)队列大小固定,无法动态增长,有溢出问题(链式不存在该问题)
//4)需要为其静态或者动态分配一块连续的内存空间
API:
void list_init(cir_list* list, const char* name, u_int list_size,void* room);//创建一个队列
u_int list_max_size(cir_list* list);//获取队列最大size
u_char list_full(cir_list* list);//队列是否满
u_char list_empty(cir_list* list);//队列是否空
u_int list_size(cir_list* list);//获取队列当前大小
void list_update_size(cir_list* list);//更新队列size
void list_enque(cir_list* list, elem_type elem);//入队
void list_deque(cir_list* list);//出队单个
void list_deque_all(cir_list* list);//全部出队
void list_dump(cir_list* list);//dump list
#define LIST_NAME_SIZE 32
typedef struct tag_list
{
char name[LIST_NAME_SIZE];
u_int front;
u_int rear;
void* phead;
u_int total_size;
u_int cur_size;
}cir_list;
typedef struct tag_elem
{
u_int a;
}elem_type;
#ifndef likely
# define likely(x) __builtin_expect(!!(x), 1)
#endif
#ifndef unlikely
# define unlikely(x) __builtin_expect(!!(x), 0)
#endif
void list_init(cir_list* list, const char* name, u_int list_size, void* room)
{
if(strlen(name)>=LIST_NAME_SIZE)
{
printf("\n list name large than %u....",LIST_NAME_SIZE);
exit(-1);
}
if(unlikely(NULL == room))
{
printf("\n room null,exit...");
exit(-1);
}
strcpy(list->name, name);
list->front = list->rear =0;
list->cur_size=0;
list->total_size = list_size;
list->phead = room;
return;
}
u_int list_max_size(cir_list* list)
{
return list->total_size;
}
//@para
// list
//@output
// 0 not full
// 1 full
u_char list_full(cir_list* list)
{
u_int max_size = list_max_size(list);
if(0 == max_size)
{
printf("\n invaild total size,equal zero!");
exit(-1);
}
return ((list->rear + 1)%max_size == list->front);
}
//@para
// list
//@output
// 0 - not empty
// 1 - empty
u_char list_empty(cir_list* list)
{
return (list->rear == list->front);
}
u_int list_size(cir_list* list)
{
return list->cur_size;
}
void list_update_size(cir_list* list)
{
u_int max_size = list_max_size(list);
list->cur_size = (list->rear + max_size - list->front)%max_size;
}
void list_enque(cir_list* list, elem_type elem)
{
u_int max_size = list_max_size(list);
elem_type* base = (elem_type*)(list->phead);
if(list_full(list))
{
printf("\nenqueue fail, list full...");
return;
}
if(!max_size || list->rear >= max_size )
{
printf("\nenqueue fail, max size invaild or rear too large...");
return;
}
memcpy(&(base[list->rear%max_size]),&elem,sizeof(elem_type));
list->rear = (list->rear+1)%max_size;
list_update_size(list);
return;
}
void list_deque(cir_list* list)
{
if(list_empty(list))
{
printf("\nlist is empty,no need done...");
return;
}
u_int max_size = list_max_size(list);
elem_type* base=(elem_type*)(list->phead);
memset(&(base[list->front%max_size]), 0 ,sizeof(elem_type));
list->front = (list->front+1)%max_size;
list_update_size(list);
return;
}
void list_deque_all(cir_list* list)
{
while(!list_empty(list))
{
list_deque(list);
}
printf("\ndeque all elem suc...");
return;
}
void list_dump(cir_list* list)
{
printf("\n=============================");
printf("\nlist detail info:");
printf("\nname = %s",list->name);
printf("\nmax size = %u",list->total_size);
printf("\ncurrent size = %u",list->cur_size);
printf("\nfront = %u",list->front);
printf("\nrear = %u",list->rear);
printf("\nphead = 0x%x",list->phead);
printf("\n=============================");
return;
}