头文件

lsg_queue.h
#pragma once

#include<stdbool.h>
/* 链式栈接口的定义头文件 */
#define true 1
#define false 0
//读写器配置
typedef struct {
unsigned char data[]; //数据
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);

实现

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 - == 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 = ; 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 = ;
while (p)
{
count += ;
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 = ; 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[]; int lenght = , i = ;
unsigned char datatemp[] = { 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 = ;
data2->lenght = ;
for (i = ; 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[], &datatemp[], ))
{
p("\n测试成功已存在");
} datatemp[] = ;
if (queue_Contains(q, datatemp, data->lenght))
{
p("已存在");
}
queue_de(q, &e);
for (i = ; i < e->lenght; i++)
{
p("%hhu ", e->data[i]);
}
queue_traverse(q, visit);
queue_destroy(q);
printf("退出");
getchar();
system("pause"); return ;
}
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

c 结构体的队列的更多相关文章

  1. 队列queue(1) 结构体实现队列

    前言 首先,我们先来做一道解密题:一串数列 7  6  8  6  6  7  0  4  1  ,规定一个回收站,把第一个数删除,添加到回收站里,然后把第二个数排到队伍最末尾,把第三个删除,添加到回 ...

  2. Windows消息队列(优先队列,结构体中放比较函数)

    Windows消息队列 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的 ...

  3. 【整理】认识MSG结构体

    在Windows程序中,消息是由MSG结构体来表示的.MSG结构体的定义如下(参见MSDN): typedef struct tagMSG { HWND hwnd; UINT message; WPA ...

  4. c# 课堂总结6 --集合与结构体

    一.集合 使用时必须添加 System.Collections 集合与数组的区别: 1:数组声明了它容纳的元素的类型,而集合不声明.这是由于集合以object形式来存储它们的元素.初始化时集合无需定义 ...

  5. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  6. HDU-1495 非常可乐 (嵌套结构体-广搜 对比 一般广搜)

    题意 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但 ...

  7. Linux串口通信之termios结构体说明

    termios结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag;      tcflag_t c_oflag;      tcflag_t c_cflag;      tcfla ...

  8. termios结构体的内容

    一.结构体成员 struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_ ...

  9. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...

随机推荐

  1. arcTo

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  2. 使用kubeadm安装Kubernetes v1.10

    关于K8S: Kubernetes是Google开源的容器集群管理系统.它构建于docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩 容缩容等整一套功能,本质上可看作是基于容器技术 ...

  3. SVM学习(五):松弛变量与惩罚因子

    https://blog.csdn.net/qll125596718/article/details/6910921 1.松弛变量 现在我们已经把一个本来线性不可分的文本分类问题,通过映射到高维空间而 ...

  4. Sql server函数的学习2(游标函数、日期函数、字符串操纵函数)

    一.游标函数与变量 游标可以处理多行数据,在过程循环中一次访问一行.和基于集合的高效操作相比,这个功能对系统资源的消耗更大. 可以用一个函数和两个全局变量来管理游标操作 1.CURSOR_STATUS ...

  5. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  6. MyEclipse持续性开发教程:用JPA和Spring管理数据(二)

    MyEclipse红运年货节 在线购买低至69折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于JPA / Spring的功能.有关设置JPA项 ...

  7. JQuery, Silverlight 公用WCF

    WCF web.config配置: <?xml version="1.0"?> <configuration> <system.web> < ...

  8. 关于plantera

    在Plantera,您可以建立属于您自己的花园,并且看着新的植物,灌木,树木和动物一起生长. 当您进行游戏,扩张您的花园时,您会吸引圆滚滚的蓝色生物小助手们,它们将帮助您捡果子,收获您的植物 有时候会 ...

  9. windows下perl的安装和脚本的运行

    参考 1.windows下perl的安装和脚本的运行: 2.fddb测试fddb的评估方法: 3.gunplot5.2.4-download: 完

  10. .NET/C# 项目如何优雅地设置条件编译符号?

    条件编译符号指的是 Conditional Compilation Symbols.你可以在 Visual Studio 的项目属性中设置,也可以直接在项目文件中写入 DefineConstants ...