数组可以这样用,灵活存储,读取,删除数据

循环数组存储数据

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define  LIST_LEN    20
#define  WRITE_LEN   25
#define  READ_LEN    20
#define  PRINT_LIST  0
#define  PRINT_WRITE 1
#define  PRINT_READ  2

typedef unsigned char u8;

typedef struct ArrayCycleList
{
          
   
    u8 *head;  //头指针
    u8 *tail;  //尾指针
    u8  size;  //剩余的内存
    u8  buf[LIST_LEN];//内存
}_LIST,*_pLIST;


void ArrayCycleList_init(_LIST *list)
{
          
   
    list->head = list->buf;
    list->tail = list->buf;
    list->size = LIST_LEN;
    memset(list->buf,0,LIST_LEN);
}


void DeleteDataFromList(_LIST *list)
{
          
   
    u8 i,len;
    len = *list->head;
    for(i=0; i<(len+1); i++)
    {
          
   
        *list->head++ = 0;
        if(list->head >= (list->buf + LIST_LEN))
            list->head = list->buf;
    }
    list->size += (len + 1);
}

void WriteByteToList(_LIST *list, u8 data)
{
          
   
    *list->tail++ = data;
    if(list->tail == (list->buf + LIST_LEN ))
        list->tail = list->buf;
    list->size--;
}

u8 ReadByteFromList(_LIST *list)
{
          
   
    u8 tmp;
    if((list->head - list->buf) >= (LIST_LEN-1))
    {
          
   
        tmp = *list->head;
        *list->head = 0;
        list->head = list->buf;
    }
    else
    {
          
   
        tmp = *list->head;
        *list->head = 0;
        list->head++;
    }
    list->size++;
    return tmp;
}

void SaveDataToList(_LIST *list, u8 *buf, u8 len)
{
          
   
    u8 i;
    if(len == 0)
        return;
    while(list->size < len+1)
        DeleteDataFromList(list);
    for(i=0; i<len+1; i++)
    {
          
   
        WriteByteToList(list,buf[i]);
    }
}

u8 ReadDataFromList(_LIST *list, u8 *buf)
{
          
   
    u8 i,len;
    if(list->head == list->tail)
        return 0;
    len = ReadByteFromList(list);
    for(i=0; i<len; i++)
    {
          
   
        buf[i] = ReadByteFromList(list);
    }
    return len;
}

void CreateData(u8 *dat, u8 len)
{
          
   
    u8 i;
    static u8 k = 1;
    dat[0] = len;
    for(i=1; i<=len; i++)
        dat[i] = k;
    k++;
}

void GetRemainSize(_LIST *list)
{
          
   
    printf("RemainSize:%d
",list->size);
}

void PrintData(_LIST *list,u8 *buf, u8 len, u8 cmd)
{
          
   
    u8 i;
    switch(cmd)
    {
          
   
    case PRINT_LIST:
        printf("List Data %d:
",len);
        break;
    case PRINT_WRITE:
        printf("Write Data %d:
",len);
        len++;
        break;
    case PRINT_READ:
        printf("Read Data %d:
",len);
        break;
    default:
        break;
    }
    for(i=0; i<len; i++)
    {
          
   
        printf("%d ",buf[i]);
    }
    printf("
");
    GetRemainSize(list);
}



int main()
{
          
   
    _LIST List;
    u8 buf[128] = {
          
   0};
    int m,n,k;
    ArrayCycleList_init(&List);
    PrintData(&List,List.buf,LIST_LEN,PRINT_LIST);
    while(1)
    {
          
   
        printf("Write len: ");
        scanf("%d",&m);
        printf("Read Enable: ");
        scanf("%d",&n);
        memset(buf,0,128);
        CreateData(buf,m);
        SaveDataToList(&List,buf,m);
        PrintData(&List,buf,m,PRINT_WRITE);
        PrintData(&List,List.buf,LIST_LEN,PRINT_LIST);
        if(n == 1)
        {
          
   
            k = ReadDataFromList(&List,buf);
            PrintData(&List,buf,k,PRINT_READ);
            PrintData(&List,List.buf,LIST_LEN,PRINT_LIST);
        }
        printf("----------------------------
");
    }
    return 0;
}
经验分享 程序员 微信小程序 职场和发展