≡
  • 网络编程
  • 数据库
  • CMS技巧
  • 软件编程
  • PHP笔记
  • JavaScript
  • MySQL
 
位置:首页 > 软件编程 > C/C++

c语言结构体队列的简单示例

人气:516 时间:2020-12-27

这篇文章主要为大家详细介绍了c语言结构体队列的简单示例,具有一定的参考价值,可以用来参考一下。

感兴趣c语言结构体队列的简单示例的小伙伴,下面一起跟随四海网的小编罗X来看看吧。<br>

头文件

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);

实现

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("
");
        p = p->next;

    }
    printf("
");
}
测试
#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
", queue_len(q));

    
    if (strncmp_Lsg(&datatemp[1], &datatemp[1], 6))
    {
        p("
测试成功已存在");
    }

    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;
}
 

本文来自:http://www.q1010.com/193/16375-0.html

注:关于c语言结构体队列的简单示例的内容就先介绍到这里,更多相关文章的可以留意四海网的其他信息。

关键词:队列

 

您可能感兴趣的文章

 
 
  • php使用redis队列操作示例
  • php队列在编程中用法示例
  • PHP操作Linux消息队列完成进程间通信的简单示例
  • MySQL 队列 实现并发读
  • SQL Server 清空service broker队列的简单示例
  • 浅谈Vuejs中nextTick()异步更新队列源码解析
  • PHP 实现队列及队列原理
  • Python 多线程异步任务队列的简单示例
  • Python线程的MQ消息队列实现及消息队列的优点
  • Python3 queue队列模块功能实例
 
上一篇:C语言<读取>和<写入> *.ini文件的简单示例
下一篇:返回列表
 
热门文章
  • c语言结构体队列的简单示例
  • C语言连接SQLSERVER数据库
  • C语言补码作用的深入分析
  • vs 用c改变部分字体颜色的简单示例
  • C语言<读取>和<写入> *.ini文件的简单示例
 
  • 最新文章
    • c语言结构体队列的简单示例
    • C语言<读取>和<写入> *.ini文件的简单示例
    • vs 用c改变部分字体颜色的简单示例
    • C语言连接SQLSERVER数据库
    • C语言补码作用的深入分析
 

四海网收集整理一些常用的php代码,JS代码,数据库mysql等技术文章。