重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要讲解了“linux下应用层编程链式队列的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下应用层编程链式队列的用法”吧!
成都创新互联专注于伊吾网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供伊吾营销型网站建设,伊吾网站制作、伊吾网页设计、伊吾网站官网定制、微信小程序开发服务,打造伊吾网络公司原创品牌,更为您提供伊吾网站排名全网营销落地服务。
本文说明,在linux下应用层程序设计时,一种链式队列的使用说明。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 实际生活中,队列的应用随处可见,比如排队买 XXX、医院的挂号系统等,采用的都是队列的结构。拿排队买票来说,所有的人排成一队,先到者排的就靠前,后到者只能从队尾排队等待,队中的每个人都必须等到自己前面的所有人全部买票成功并从队头出队后,才轮到自己买票。这就是典型的队列结构。 链式队列不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。 下面给出链式队列的完整源码,已经验证可行,需要的话可以直接参考使用。
/*
*******************************************************************************
* INCLUDE
*******************************************************************************
*/
#include "queue.h"
#include
#include
#include
#include "debug.h"
#include "log.h"
//初始化队列,建立一个空队列Q
Status InitQueue(LinkQueue* Q)
{
Q->front = NULL;
Q->rear = NULL;
sem_init(&Q->sem_lock, 0, 1);
return OK;
}
//若队列Q存在则销毁它
Status DestroyQueue(LinkQueue* Q)
{
sem_wait(&Q->sem_lock);
QeuePtr qn_tmp_ptr;
while(Q->front)
{
qn_tmp_ptr = Q->front;
Q->front = Q->front->next;
free(qn_tmp_ptr);
}
free(Q);
sem_post(&Q->sem_lock);
return OK;
}
//将队列Q清空
Status ClearQueue(LinkQueue* Q)
{
sem_wait(&Q->sem_lock);
QeuePtr qn_tmp_ptr;
qn_tmp_ptr = Q->front;
while(qn_tmp_ptr)
{
memset(&qn_tmp_ptr->data, 0, sizeof(QElemType));
qn_tmp_ptr = qn_tmp_ptr->next;
}
sem_post(&Q->sem_lock);
return OK;
}
//若队列为空返回OK,否则返回ERROR
Status QueueEmpty(LinkQueue Q)
{
sem_wait(&Q.sem_lock);
if (!Q.front)
{
return OK;
}
else
{
return ERROR;
}
sem_post(&Q.sem_lock);
}
//若队列Q存在且非空,用e返回队列Q的队头元素
Status GetHead(LinkQueue Q, QElemType *e)
{
sem_wait(&Q.sem_lock);
*e = Q.front->data;
sem_post(&Q.sem_lock);
return OK;
}
//入队列,若队列Q存在,插入新元素e到队列Q中并成为队尾元素
Status EnQueue(LinkQueue* Q, QElemType e)
{
sem_wait(&Q->sem_lock);
QeuePtr s = (QeuePtr)malloc(sizeof(QNode));
if (s == NULL)//分配内存失败
{
return ERROR;
}
s->data = e;
s->next = NULL;
/* 判断,现在队列里面有没有节点 */
if (Q->front == NULL)
{
Q->front = s;
Q->rear = s;
}
else
{
Q->rear->next = s;
Q->rear = s;
}
sem_post(&Q->sem_lock);
return OK;
}
//返回队列Q中的元素个数
int QueueLength(LinkQueue Q)
{
sem_wait(&Q.sem_lock);
int count = 0;
while(Q.front)
{
count++;
Q.front = Q.front->next;
}
sem_post(&Q.sem_lock);
return count;
}
void PrintQueue(LinkQueue Q)
{
sem_wait(&Q.sem_lock);
while(Q.front)
{
DEBUG_LOG(MSG_DEBUG, "Q.front->data.len=[%d]!!!\n", Q.front->data.len);
DEBUG_LOG_HEX(MSG_DEBUG, "Q.front->data.buf\n", Q.front->data.buf, Q.front->data.len);
Q.front = Q.front->next;
}
sem_post(&Q.sem_lock);
}
//出队列,删除队列Q的队头元素,并用e返回其值
Status deQueue(LinkQueue* Q, QElemType* e)
{
if (Q->front == NULL)
{
printf("delQueue: this queue is empty\n");
return ERROR;
}
sem_wait(&Q->sem_lock);
*e = Q->front->data;
QeuePtr p = Q->front;
Q->front = Q->front->next;
free(p);
sem_post(&Q->sem_lock);
return OK;
}
#ifndef __QUEUE_H__
#define __QUEUE_H__
#include
/**
* 队列(C语言实现,基于链式结构)
*/
#define OK 1
#define ERROR 0
typedef struct lora
{
unsigned char buf[70];//存储数据帧
int len;//存储有效数据长度
}lora;
typedef int Status;
typedef lora QElemType;//QElemType类型视情况而定,这里为结构体
//定义队列节点的结构
typedef struct QNode
{
QElemType data;
struct QNode* next;
}QNode, *QeuePtr;
//定义队列的链表结构
typedef struct
{
QeuePtr front;
QeuePtr rear;
sem_t sem_lock;
}LinkQueue;
/*
* 初始化一个空队列
*/
Status InitQueue(LinkQueue* q);
/*
* 销毁队列
*/
Status DestroyQueue(LinkQueue* q);
/*
* 清空队列
*/
Status ClearQueue(LinkQueue* q);
/*
* 判断队列是否为空
*/
Status QueueEmpty(LinkQueue Q);
/*
* 获取队列第一个元素的值
*/
Status GetHead(LinkQueue Q, QElemType *e);
/*
* 入队列
*/
Status EnQueue(LinkQueue* Q, QElemType e);
/*
* 获取队列长度
*/
int QueueLength(LinkQueue Q);
/*
* 打印队列所有元素
*/
void PrintQueue(LinkQueue Q);
/*
* 出队列
*/
Status deQueue(LinkQueue* Q, QElemType* e);
#endif
感谢各位的阅读,以上就是“linux下应用层编程链式队列的用法”的内容了,经过本文的学习后,相信大家对linux下应用层编程链式队列的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!