c 结构体的队列
头文件
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 结构体的队列的更多相关文章
- 队列queue(1) 结构体实现队列
前言 首先,我们先来做一道解密题:一串数列 7 6 8 6 6 7 0 4 1 ,规定一个回收站,把第一个数删除,添加到回收站里,然后把第二个数排到队伍最末尾,把第三个删除,添加到回 ...
- Windows消息队列(优先队列,结构体中放比较函数)
Windows消息队列 消息队列是Windows系统的基础.对于每个进程,系统维护一个消息队列.如果在进程中有特定事件发生,如点击鼠标.文字改变等,系统将把这个消息加到队列当中.同时,如果队列不是空的 ...
- 【整理】认识MSG结构体
在Windows程序中,消息是由MSG结构体来表示的.MSG结构体的定义如下(参见MSDN): typedef struct tagMSG { HWND hwnd; UINT message; WPA ...
- c# 课堂总结6 --集合与结构体
一.集合 使用时必须添加 System.Collections 集合与数组的区别: 1:数组声明了它容纳的元素的类型,而集合不声明.这是由于集合以object形式来存储它们的元素.初始化时集合无需定义 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- HDU-1495 非常可乐 (嵌套结构体-广搜 对比 一般广搜)
题意 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但 ...
- Linux串口通信之termios结构体说明
termios结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcfla ...
- termios结构体的内容
一.结构体成员 struct termios { tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_ ...
- Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...
随机推荐
- ORACLE11G内存管理参数
今天,对ORACLE11G的几个内存参数看了一下,记录如下,大家可以参考: 1.首先,在ORACLE11G的INIT.ORA里,有“__”开头的参数,也就是以两个下划线开头的参数,这种参数应该是系统自 ...
- spark RDD操作的底层实现原理
RDD操作闭包外部变量原则 RDD相关操作都需要传入自定义闭包函数(closure),如果这个函数需要访问外部变量,那么需要遵循一定的规则,否则会抛出运行时异常.闭包函数传入到节点时,需要经过下面的步 ...
- kill word fore out
1● fore f ɔ: 预先,前面
- 如何解决Css属性text-overflow:ellipsis 不起作用(文本溢出显示省略号)
如何使text-overflow:elipsis起作用? 想要使用css属性text-overflow:elipsis起到作用,样式必须跟overflow:hidden; white-space:no ...
- learning shell built-in variables (1)
Shell built-in variables [Purpose] Learning shell built-in variables, example $0,$1,$2,$3,$#, ...
- SQL Server 调优系列进阶篇 - 查询语句运行几个指标值监测
前言 上一篇我们分析了查询优化器的工作方式,其中包括:查询优化器的详细运行步骤.筛选条件分析.索引项优化等信息. 本篇我们分析在我们运行的过程中几个关键指标值的检测. 通过这些指标值来分析语句的运行问 ...
- maven install deploy
1.安装到本地仓库 install jar to local fs mvn .jar -DgroupId=com.bonc -DartifactId=licenseVerify-.jar -Dvers ...
- PHP excel reader , excel时间转成php时间格式
最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内的数据导入到系统中.其中,关于日期格式的导入,使我犯了难. 首先,如何导入日期, ...
- 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器基础板载资源 ...
- iOS多线程编程:线程同步总结
1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...