溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux下應(yīng)用層編程鏈式隊列的用法

發(fā)布時間:2021-08-11 12:00:24 來源:億速云 閱讀:128 作者:chen 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“l(fā)inux下應(yīng)用層編程鏈式隊列的用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“l(fā)inux下應(yīng)用層編程鏈式隊列的用法”吧!

       本文說明,在linux下應(yīng)用層程序設(shè)計時,一種鏈式隊列的使用說明。隊列是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。 實際生活中,隊列的應(yīng)用隨處可見,比如排隊買 XXX、醫(yī)院的掛號系統(tǒng)等,采用的都是隊列的結(jié)構(gòu)。拿排隊買票來說,所有的人排成一隊,先到者排的就靠前,后到者只能從隊尾排隊等待,隊中的每個人都必須等到自己前面的所有人全部買票成功并從隊頭出隊后,才輪到自己買票。這就是典型的隊列結(jié)構(gòu)。 鏈式隊列不需要考慮空間利用的問題,因為鏈式隊列本身就是實時申請空間。因此,這可以算作是鏈式隊列相比順序隊列的一個優(yōu)勢。 下面給出鏈式隊列的完整源碼,已經(jīng)驗證可行,需要的話可以直接參考使用。

    linux下應(yīng)用層編程鏈式隊列的用法

/*
 *******************************************************************************
 *                                   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)//分配內(nèi)存失敗
    {
        return ERROR;
    }

    s->data = e;
    s->next = NULL;

    /* 判斷,現(xiàn)在隊列里面有沒有節(jié)點 */
    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中的元素個數(shù)
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語言實現(xiàn),基于鏈式結(jié)構(gòu))
 */

#define OK       1
#define ERROR    0

typedef struct lora
{
    unsigned char buf[70];//存儲數(shù)據(jù)幀
    int len;//存儲有效數(shù)據(jù)長度
}lora;

typedef int Status;
typedef lora QElemType;//QElemType類型視情況而定,這里為結(jié)構(gòu)體

//定義隊列節(jié)點的結(jié)構(gòu)
typedef struct QNode
{
    QElemType data;
    struct QNode* next;
}QNode, *QeuePtr;

//定義隊列的鏈表結(jié)構(gòu)
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
 

感謝各位的閱讀,以上就是“l(fā)inux下應(yīng)用層編程鏈式隊列的用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對linux下應(yīng)用層編程鏈式隊列的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI