| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- /*
- * @Description:
- * @Version: 2.0
- * @Author: Seven
- * @Date: 2023-05-15 10:34:06
- * @LastEditors: Seven
- * @LastEditTime: 2023-05-18 14:38:44
- */
- #include "list.h"
- #include "includes.h"
- list_single_t *P_list;
- list_info_t list_info;
- //创建链表
- list_single_t *CreateLinkList(void)
- {
- list_single_t *head;
- printf("list len=%d\n",sizeof(list_single_t));
- head = malloc(sizeof(list_single_t));
- if(head == NULL)
- return NULL;
- memset(head,0,sizeof(list_single_t));
-
- // printf("int len=%d\n",sizeof(int *));
- // head->data = malloc(sizeof(int *));
- // if(head->data == NULL)
- // return NULL;
- // memset(head->data,0,sizeof(int *));
-
- head->next = NULL;
- return head;
- }
- //遍历链表
- void DisplayLinkList(list_single_t *head)
- {
- list_single_t *p = head->next;
- while (p != NULL)
- {
- printf("%d\n",p->data[0]);
- p = p->next;
- }
- printf("\n");
- }
- //清空链表
- void EmptyLinkList(list_single_t *list)
- {
- list_single_t *p = list->next;
- list_single_t *temp;
- while(p != NULL)
- {
- temp = p;
- p = p->next;
- free(temp->data);
- free(temp);
- }
-
- }
- //从头部插入
- int list_insert_head(list_single_t *head, uint8_t *data, uint16_t len)
- {
- list_single_t *p = head;
- list_single_t *q;
- q = malloc(sizeof(list_single_t));
- if(q == NULL)
- return -1;
- memset(q,0,sizeof(list_single_t));
-
- q->data = malloc(len);
- if(q->data == NULL)
- return -2;
- memset(q->data,0,len);
-
- q->len = len;
- memcpy(q->data,data,len);
- q->next = p->next;
- p->next = q;
- return 1;
- }
- //从尾部插入
- int list_insert_tail(list_single_t *head, uint8_t *data, uint16_t len)
- {
- list_single_t *p = head;
- list_single_t *q;
- q = malloc(sizeof(list_single_t));
- if(q == NULL)
- return -1;
- memset(q,0,sizeof(list_single_t));
- q->data = malloc(len);
- if(q->data == NULL)
- return -2;
- memset(q->data,0,len);
- q->len = len;
- memcpy(q->data,data,len);
- while (p->next!=NULL)//找到尾
- {
- p=p->next;
- }
- q->next = NULL;
- p->next = q;
- return 1;
- }
- //判断链表是否为空
- int8_t Check_List_Empty(list_single_t *list)
- {
- return (list == NULL || list->next==NULL);
- }
- //从头部删除数据
- int list_delet_head(list_single_t *list)
- {
- list_single_t *p = list;
- list_single_t *temp;
-
- if(Check_List_Empty(p))
- return -1;
-
- temp = p->next;
- p->next = temp->next;
- // printf("data len=%u\n",temp->len);
- // data_dump("list delet",temp->data,temp->len);
- free(temp->data);
- free(temp);
- return 0;
- }
- //从尾部删除数据
- int list_delet_tail(list_single_t *list)
- {
- list_single_t *p = list;
- list_single_t *temp;
-
- if(Check_List_Empty(p))
- return -1;
- while(p->next->next!=NULL)
- {
- p = p->next;
- }
-
- temp = p->next;
- p->next = temp->next;
- free(temp->data);
- free(temp);
- return 0;
- }
- //从头部读取数据
- void list_read_head(list_single_t *list, uint8_t *data, uint16_t *len)
- {
- list_single_t *p = list;
- list_single_t *temp;
- if(Check_List_Empty(p))
- return;
- temp = p->next;
- memcpy(data,temp->data,temp->len);
- *len = temp->len;
- return;
- }
- //从尾部读取数据
- void list_read_tail(list_single_t *list, uint8_t *data, uint16_t *len)
- {
- list_single_t *p = list;
- list_single_t *temp;
-
- if(Check_List_Empty(p))
- return;
- while(p->next->next!=NULL)
- {
- p = p->next;
- }
-
- temp = p->next;
- memcpy(data,temp->data,temp->len);
- *len = temp->len;
- return;
- }
- //uint8_t list_num = 0;
- //timeout_t tt_list={0xff,0,(2*1000)};
- //uint16_t list_len;
- //uint8_t list_buf[100];
- ////测试
- //void test_list(void)
- //{
- // uint16_t i,data_len;
- // uint8_t buf[100];
- // // if(list_info.insert_flag)
- // if(timeout_isOut(&tt_list))
- // {
- // // list_info.insert_flag = 0;
- // srand(TickCounter);
- //// data_len = rand()%64+1;
- // data_len = 90;
- // for(i = 0; i < data_len; i++)
- // {
- // srand(TickCounter+i);
- // buf[i] = rand()%0x100;
- // }
- // printf("list insert len=%d\n",data_len);
- //// data_dump("list insert",buf,data_len);
- //// list_insert_tail(P_list,buf,data_len);
- //
- // RS485_TX();
- // delay_us(200);
- //// uart_msg_send(UART4_ID,(char *)buf,data_len);
- //// delay_us(200);
- // uart3_dma_send((uint8_t *)buf,data_len);
- // data_dump("list insert",buf,data_len);
- //// uart3_dma_test();
- // // Bubble_Sort(buf,data_len);
- //// Bidirectional_Bubble_Sort(buf,0,data_len-1);
- // // Select_Sort(buf,data_len);
- // // Insert_Sort(buf,data_len);
- //// data_dump("sort",buf,data_len);
- // }
- // // if(list_info.delet_flag)
- // {
- //// if(Check_List_Empty(P_list))
- //// {
- //// // list_info.delet_flag = 0;
- //// // list_num = 0;
- //// }
- //// else
- //// {
- //// // printf("delet num:%d\n",list_num++);
- //// list_read_head(P_list,list_buf,&list_len);
- //// list_delet_head(P_list);
- //// printf("data len=%u\n",list_len);
- //// data_dump("list delet",list_buf,list_len);
- //// }
- // }
- //}
- //冒泡排序(从小到大)
- void Bubble_Sort(uint8_t *data, uint16_t len)
- {
- uint32_t i,j,temp;
- for(i = 0; i < len-1; i++)
- {
- for(j = 0; j < len-1-i; j++)
- {
- if(data[j] > data[j+1])//从小到大排序
- {
- temp = data[j];
- data[j] = data[j+1];
- data[j+1] = temp;
- }
- }
- }
- }
- //双向冒泡排序(从小到大)
- void Bidirectional_Bubble_Sort(uint8_t *data, uint16_t left, uint16_t right)
- {
- uint32_t i,temp;
- if(left >= right)
- return;
- if(left < right)
- {
- for(i = left; i < right; i++)
- {
- if(data[i] > data[i+i])//最大值移动到最右端处
- {
- temp = data[i];
- data[i] = data[i+1];
- data[i+1] = temp;
- }
- }
- for(i = right; i > left; i--)
- {
- if(data[i] < data[i-1])//最小值移动到最左端处
- {
- temp = data[i];
- data[i] = data[i-1];
- data[i-1] = temp;
- }
- }
- Bidirectional_Bubble_Sort(data,left+1,right-1);//重复运算,直到left>=right(此处使用递归调用)
- }
- }
- //选择排序(从小到大)
- void Select_Sort(uint8_t *data, uint16_t len)
- {
- uint32_t i,j,temp;
- for(i = 0; i < len-1; i++)
- {
- for(j = i+1; j < len; j++)
- {
- if(data[i] > data[j])
- {
- temp = data[i];
- data[i] = data[j];
- data[j] = temp;
- }
- }
- }
- }
- //插入排序(从小到大)
- void Insert_Sort(uint8_t *data, uint16_t len)
- {
- uint32_t temp;
- int i,j;
- for(i = 1; i < len; i++)
- {
- temp = data[i];
- j = i-1;
- while((j>=0) && (data[j]>temp))
- {
- data[j+1] = data[j];
- j--;
- }
- data[j+1] = temp;
- }
- }
|