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