顺序队列的读写

代码中有详细注释

cmakelist

cmake_minimum_required(VERSION 3.17)
project(A)

set(CMAKE_CXX_STANDARD 14)


add_executable(A  fun.cpp final.cpp)
#add_executable(A queue.c)

find_package(Threads REQUIRED)
target_link_libraries(A Threads::Threads)

fun.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "final.h"
#include <unistd.h>
#include<pthread.h>
//C 库函数 void *memset(void *str, int c, size_t n)
// 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符
//该值返回一个指向存储区 str 的指针。


//C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1
//该函数返回一个指向目标存储区 str1 的指针。

void init_queue(struct Queue *q,int data_size,int max_len )
{
    q->data=(mytype *)malloc(data_size*(max_len+1));
    if(q->data==NULL)
    {
        printf("malloc error\n");
        return ;
    }
    q->front=0;
    q->rear=0;
    q->data_size=data_size;
    q->max_len=max_len+1;
    printf("init ok\n");
    return;
}


int en_queue(struct Queue *q,mytype *data)//向队列的尾部插入一个数据,请传入数据类型的长度
{
    if((q->rear+1) % (q->max_len) ==q->front)
    {
        printf("this queue is full\n");
        return -1;
    }

    memcpy(q->data+q->rear,data,q->data_size);


    q->rear=(q->rear+1)%(q->max_len);
    return 0;


}
int de_queue(struct Queue *q,void *e)//删除头部一个节点和他的数据域
{
    if(q->front==q->rear)
    {
        printf("this queue is empty\n");
        return -1;
    }
    memcpy(e,q->data+q->front,q->data_size);

    q->front=(q->front+1)%(q->max_len);
    return 0;
}
int get_queue_length(struct Queue *q)
{
    return (q->rear-q->front+q->max_len%q->max_len);
}

int read_queue_save(struct Queue *q,mytype * out_space)//传入数据类型的大小  读取数据并且保存 先不删
{
    if(q->front==q->rear)
    {
        printf("this queue is empty\n");
        return -1;
    }
    memcpy(out_space,q->data+q->front,q->data_size);
  //  memcpy(out_space,&q->data[q->rear], size_len);
    return 0;
}

final.h

#ifndef _QUEUE_H_
#define _QUEUE_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#ifdef __cplusplus
extern "C"
{
#endif


#define BUFFER_SIZE 2048
typedef struct DATA1{
    int ID;
    char sex[16];
    char name[26];

}data1,data3;//数据来源



typedef struct DATA1 mytype;

struct Queue {
    int front;
    int rear;
    int data_size;//数据域大小
    int max_len;//队列长度
    mytype *data;
};
void init_queue(struct Queue *q,int data_size,int max_len );
int en_queue(struct Queue *q,mytype *data);
int de_queue(struct Queue *q,void *e);
int get_queue_length(struct Queue *q);
int read_queue_save(struct Queue *q,mytype * out_space);
#ifdef __cplusplus
}
#endif

#endif

final.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "final.h"
#include <unistd.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

struct parameter
{
    int fd;
    struct Queue *q;
};

struct parameter *par1=new parameter;


int main()
{
    struct Queue q;


    DATA1 data1;//模拟发送空间
    DATA1 data3;//模拟read空间
   init_queue(&q,sizeof(DATA1),100);
 
    strcpy(data1.sex,"man");
    strcpy(data1.name,"good morning");


    for(int i = 0 ;i < 100; i++)
    {
        data1.ID = i;
       int a= en_queue(&q, &data1);
       if(a==-1)
       {
           return -1;
       }
      //  sleep(1);//模拟数据插入频率


    mytype *e;
    while(1)
    {
        sleep(1);//模拟数据读取频率
        int i;
        int flag;
        i=read_queue_save(&q,&data3);//i为处理成功的标志位
        if(i == 0)
        {

            if(flag==-1)
            {
                return -1;
            }
            printf("read success ID = %d , sex = %s , name = %s\n",data3.ID,data3.sex,data3.name);
            flag = de_queue(&q,e);


        }
        else
        {
            printf("read error\n");
        }

    }

    return  0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值