顺序环形队列

//顺序环形队列
//特点:
//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;

}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值