頭文件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; }