/* * @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; } }