千家信息网

linux下应用层编程链式队列的用法

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要讲解了"linux下应用层编程链式队列的用法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"linux下应用层编程链式队列的用法"吧!本文说
千家信息网最后更新 2025年01月23日linux下应用层编程链式队列的用法

这篇文章主要讲解了"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下应用层编程链式队列的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

队列 链式 元素 应用 结构 应用层 编程 就是 学习 一端 内容 情况 数据 空间 节点 长度 问题 存储 验证 可行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法律常识黑板报 集团网络安全事件通报分几类 做软件开发经常呆在外包公司好吗 怎么增强人民的网络安全意识 汝阳县水利局数据库 有哪几个网络安全软件 速联服务器 网络安全在线讲解 和平精英的免费服务器是多少 内蒙古放心软件开发以客为尊 2020年网络安全执法案例 db2删除服务器上的表 上海企业软件开发哪家便宜 德宏云南众福互联网科技有限公司 高邑智能软件开发服务咨询问价 nc57数据库导入 中小学生网络安全讲座 什么叫做服务器的生命周期 数据结构与数据库技术复习 车载网络技术 提高网络安全设备拦截率 黔江区工商软件开发服务常见问题 阿里云服务器租用价格表 做金融软件开发的必备知识 王者荣耀把登陆过的服务器清除 关于弹性云服务器描述不正确的是 阿里云服务器企业级用户成本估算 小白菜基因组数据库 东莞mes软件开发商 网络安全信息的种类
0