c 結構體的隊列

頭文件node

lsg_queue.h
#pragma once

#include<stdbool.h>
/* 鏈式棧接口的定義頭文件 */
#define true 1
#define false 0
//讀寫器配置
typedef struct {
    unsigned char data[600];   //數據
    unsigned int lenght;   // 有效數據
}Data;

/* 隊列的數據類型 */
typedef Data * datatype;

/* 靜態鏈的數據結構 */
typedef struct q_node {
    datatype data;
    struct q_node *next;
}q_node, *link_node;

typedef struct l_queue {
    /* 隊頭指針 */
    q_node *front;
    /* 隊尾指針 */
    q_node *rear;
}*link_queue;


/* 靜態順序鏈的接口定義 */


/* 靜態鏈的初始化 */
link_queue queue_init();

/* 判斷隊列是否爲空,若爲空
* 返回true
* 不然返回false
*/
int queue_empty(link_queue q);

/* 插入元素e爲隊q的隊尾新元素
* 插入成功返回true
* 隊滿返回false
*/
int queue_en(link_queue q, datatype e);


/* 隊頭元素出隊
* 用e返回出隊元素,並返回true
* 若隊空返回false
*/
int queue_de(link_queue q, datatype *e);

/* 清空隊 */
void queue_clear(link_queue q);

/* 銷燬隊 */
void queue_destroy(link_queue q);
//判斷epcid是否已存在隊列中,true在,false不在
bool queue_Contains(link_queue q, unsigned char * data, int lenght);
/* 得到隊頭元素
* 隊列非空,用e返回隊頭元素,並返回true
* 不然返回false
*/
int get_front(link_queue q, datatype *e);

bool strncmp_Lsg(unsigned char * data, unsigned char * data2, int lenght);
/* 得到隊長 */
int queue_len(link_queue q);

/* 遍歷隊 */
void queue_traverse(link_queue q, void(*visit)(link_queue q));


void visit(link_queue q);

實現windows

lsg_queue.c
/* 接口的實現文件 */
#include<stdio.h>
#include<stdlib.h>
#include"lsg_queue.h"
#include<string.h>
//一個特殊的隊列,出列,並未刪除,使用一個線程來按照存在在隊列固定時間後刪除
link_queue queue_init()
{
    /* 新建頭結點 */
    link_node new_node = (link_node)malloc(sizeof(q_node));
    new_node->next = NULL;
    /* 指針結點 */
    link_queue q = (link_queue)malloc(sizeof(*q));
    q->front = q->rear = new_node;
    return q;
}


int queue_empty(link_queue q)
{
    return q->front == q->rear;
}


int queue_en(link_queue q, datatype e)
{
    /* 新建數據結點 */
    link_node new_node = (link_node)malloc(sizeof(q_node));
    /* 內存分配失敗 */
    if (!new_node)
        return false;
    new_node->data = e;
    new_node->next = NULL;
    q->rear->next = new_node;
    q->rear = new_node;
    return true;
}
/* 隊頭元素出隊
* 用e返回出隊元素,並返回true
* 若隊空返回false
*/
int queue_de(link_queue q, datatype * e)
{
    /* 隊列爲空 */
    if (q->front == q->rear)
        return false;
    *e = q->front->next->data;
    link_node temp = q->front->next;
    q->front->next = temp->next;
    /* 防止丟失尾指針 */
    if (temp == q->rear)
        q->rear = q->front;
    free(temp);
    temp = NULL;
    return true;
}
//判斷epcid是否已存在隊列中,true在,false不在
bool queue_Contains(link_queue q, unsigned char * data, int lenght)
{
    /* 頭結點 */
    link_node head = q->front;
    /* 第一個結點 */
    link_node temp = head->next;
    while (temp)
    {
        //去掉後面的rssi值跟校驗位 temp->data->lenght-2 == lenght
        if (strncmp_Lsg(temp->data->data, data, lenght) && temp->data->lenght - 2 == lenght)
        {
            return true;
        }
        link_node p = temp;
        temp = p->next;
    }
    return false;
}

bool strncmp_Lsg(unsigned char * data, unsigned char * data2, int lenght)
{
    int i;
    for (i = 0; i < lenght; i++)
    {
        if (*data != *data2)
        {
            return false;
        }
        data++;
        data2++;
    }

    return true;
}

void queue_clear(link_queue q)
{
    /* 頭結點 */
    link_node head = q->front;

    q->front = q->rear = head;
    /* 第一個結點 */
    link_node temp = head->next;
    while (temp)
    {
        link_node p = temp;
        temp = p->next;
        free(p->data);
        free(p);
        p = NULL;
    }
    head->next = NULL;
}


void queue_destroy(link_queue q)
{
    queue_clear(q);
    //清頭節點
    free(q->front);
    free(q);
    q = NULL;
}


int get_front(link_queue q, datatype * e)
{
    /* 隊爲空 */
    if (q->front == q->rear)
        return false;

    *e = q->front->next->data;
    return true;
}


int queue_len(link_queue q)
{
    /* 頭結點 */
    link_node p = q->front->next;
    /* 計數器 */
    int count = 0;
    while (p)
    {
        count += 1;
        p = p->next;
    }
    return count;
}


void queue_traverse(link_queue q, void(*visit)(link_queue q))
{
    visit(q);
}

void visit(link_queue q)
{
    int i;
    /* 頭結點 */
    link_node p = q->front->next;
    if (!p)
    {
        printf("隊列爲空");
    }
    while (p)
    {
        printf("開始輸出:");
        for (i = 0; i < p->data->lenght; i++)
        {
            printf("%hhu ", p->data->data[i]);
        }
        printf("\n");
        p = p->next;

    }
    printf("\n");
}

測試數據結構

#pragma warning(disable:4996) 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <winnt.h>
#include"lsg_queue.h"
#define BAUD_RATE 9600
#define p printf

int main(int argc, char *argv[])
{
    char buf[50];

    int lenght = 0, i = 0;
    unsigned char datatemp[6] = { 0xA0, 0x06, 0x01, 0x74 };
    datatype e = NULL;
    link_queue q = queue_init();

    Data * data = (struct Data*)malloc(sizeof(Data));/*2.結構體指針須要初始化*/
    Data * data2 = (struct Data*)malloc(sizeof(Data));/*2.結構體指針須要初始化*/
    data->lenght = 6;
    data2->lenght = 6;
    for (i = 0; i < data->lenght; i++)
    {
        data->data[i] = datatemp[i];
        data2->data[i] = datatemp[i];
    }
    printf("加入隊列");

    queue_en(q, data);

    
    queue_en(q, data);
    printf("length=%d\n", queue_len(q));

    
    if (strncmp_Lsg(&datatemp[1], &datatemp[1], 6))
    {
        p("\n測試成功已存在");
    }

    datatemp[0] = 0;
    if (queue_Contains(q, datatemp, data->lenght)) 
    {
        p("已存在");
    }
    queue_de(q, &e);
    for (i = 0; i < e->lenght; i++)
    {
        p("%hhu ", e->data[i]);
    }
    queue_traverse(q, visit);
    queue_destroy(q);
    printf("退出");
    getchar();
    system("pause");

    return 0;
}
聲明:原創博客請在轉載時保留原文連接或者在文章開頭加上本人博客地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設置打賞功能,若有特殊需求請與本人聯繫!
相關文章
相關標籤/搜索