头文件

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. 点击input文字会自动消失

    <input type="text" name="q" value="请输入关键字" style="width:128px; ...

  2. PHP:第一章——PHP中的数组运算符和类运算符

    数组运算符: $a+$b;//$a和$b的联合 $a == $b;//比较$a与$b的值相同为true; $a === $b;//如果$a与$b的值与顺讯完全相同为true; $a !=$b;//如果 ...

  3. TypeScript安装

    1.Installing Node.js and updating npm Updating npm----npm install npm@latest -g Installing TypeScrip ...

  4. Webserivce简单安全验证

    最近新接了一个需要调用第三方WebService的项目,看到这个第三方WebService被调用的时候,需要授权用户名和密码,于是自己也想对WebService的安全授权这个方面进行了一下研究,以前调 ...

  5. [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序

    [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序   一.练习项目: http://www.asp.net/mvc/tutorials/mvc-4/gettin ...

  6. Jboss7 部署EJB3 简明教程

    什么是EJB? EJB 是 Java 企业Bean, 是JavaEE服务端 企业组件模型,它的设计目标与核心应用是部署分布式应用程序.话不多说,直接看如何在本机部署EJB3.   部署环境: 操作系统 ...

  7. Solr增删改查索引

    一.添加索引,提交文档 1.如图,我的xml文档有predicate.object字段,这些在Solr配置文档里没有,所以xml文档提交不了 2.在F:\solr-4.10.0\example\sol ...

  8. python笔记05:条件、循环和其它语句

    5.1 print和import的更多使用方式 5.1.1 使用逗号输出 print 'Age',42 print 1,2,3 如果要同时输出文本和变量值,又不希望使用字符串格式化的话,那么这个特性就 ...

  9. Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException

    最近在使用poi操作excel时发现一个问题,详细如下: Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethod ...

  10. 解决在转发一条内容为满的彩信,删除主题FWD,发送的时候提示转化为短信。

    问题描述: 1.长按一条输入内容为满的彩信,选择转发 2.输入联系人-删除主题FWD-发送 测试结果为:提示正转化为短信(见附件) 预期结果为:不应该有提示,应该还是彩信 测试结果图为: 根据提示的T ...