数组可以这样用,灵活存储,读取,删除数据
循环数组存储数据
#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;
}
下一篇:
c语言——删除单链表中的重复元素
