您好,登录后才能下订单哦!
这篇文章主要讲解了“linux下应用层编程链式队列的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux下应用层编程链式队列的用法”吧!
本文说明,在linux下应用层程序设计时,一种链式队列的使用说明。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 实际生活中,队列的应用随处可见,比如排队买 XXX、医院的挂号系统等,采用的都是队列的结构。拿排队买票来说,所有的人排成一队,先到者排的就靠前,后到者只能从队尾排队等待,队中的每个人都必须等到自己前面的所有人全部买票成功并从队头出队后,才轮到自己买票。这就是典型的队列结构。 链式队列不需要考虑空间利用的问题,因为链式队列本身就是实时申请空间。因此,这可以算作是链式队列相比顺序队列的一个优势。 下面给出链式队列的完整源码,已经验证可行,需要的话可以直接参考使用。
/*
*******************************************************************************
* INCLUDE
*******************************************************************************
*/
#include "queue.h"
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#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 <semaphore.h>
/**
* 队列(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下应用层编程链式队列的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。