您好,登錄后才能下訂單哦!
這篇文章主要講解了“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。