【使用C语言创建队列】

文章介绍了如何在C语言中实现队列,通过创建一个环形缓冲区结构体来存储网络通信数据,避免丢包。定义了入队、出队和计算队列长度的函数,同时提供了结构体变量的初始化方法。但最终发现实际需求已在其他模块实现,此处的队列实现可能多余。
摘要由CSDN通过智能技术生成

使用C语言实现队列

目的

在做lvgl界面时,想用一种数据结构来创建一个缓冲区,负责保存网络通信传输过来的信息,然后一个一个去更新chart中的数据,很自然就想起来了C++中的队列,可是C语言没有显式定义这样的数据结构,怎么去实现呢?

思路

之前看韦东山老师的课程,他就用了一个环形缓冲区的概念,也是防止发生丢数据的现象,好像都是一样的意思。
关键是区分队满和队空的两种情况,因为队首==队尾不能同时代表两种情况,所以只能牺牲一个内存区间,里面是不会存放数据的。

代码


#pragma region /* 实现队列 start */

#define DEQUE_SIZE 100

typedef struct NetDataBuff{
    int front;
    int rear;
    int data[DEQUE_SIZE];
}NetDataQueue, *PNetDataQueue;

/* 入队 */
int EnQueue(PNetDataQueue ptNetDataBuff, int x){
    if ((ptNetDataBuff->rear + 1) % DEQUE_SIZE == ptNetDataBuff->front){    //队列满
        return 0;
    }else{
        ptNetDataBuff->data[ptNetDataBuff->rear] = x;
        return 1;
        ptNetDataBuff->rear = (ptNetDataBuff->rear + 1) % DEQUE_SIZE;
    }    
}

/* 取队列头并出队 */
int OutQueue(PNetDataQueue ptNetDataBuff,int *x){
    if (ptNetDataBuff->rear == ptNetDataBuff->front){    //队列空
        return 0;
    }else{
        *x = ptNetDataBuff->data[ptNetDataBuff->front];
        ptNetDataBuff->front = (ptNetDataBuff->front + 1) % DEQUE_SIZE;        
        return 1;
    }    
}

/* 计算队列长度 */
int QueueLength(PNetDataQueue ptNetDataBuff){
    return ((ptNetDataBuff->rear - ptNetDataBuff->front + DEQUE_SIZE) % DEQUE_SIZE);
}

#pragma endregion /* 实现队列 end */

对结构体中的数组进行初始化

/* 1.创建结构体变量的时候进行初始化*/
static NetDataQueue g_tNetDataBufferSeries = {0,0,{0}};

/* 2.创建结构体的时候没有初始化,后面单独进行初始化 */
 void NetDataInit(PNetDataQueue ptNetDataBuff){
     ptNetDataBuff->front  = 0;
     ptNetDataBuff->rear   = 0;
     memset(ptNetDataBuff->data,0,sizeof(ptNetDataBuff->data));
 }

what

后来发现,已经在Event那里实现了缓冲区,这里应该是不需要再搞一层了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值