list.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2023-05-15 10:34:06
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2023-05-18 14:38:44
  8. */
  9. #include "list.h"
  10. #include "includes.h"
  11. list_single_t *P_list;
  12. list_info_t list_info;
  13. //创建链表
  14. list_single_t *CreateLinkList(void)
  15. {
  16. list_single_t *head;
  17. printf("list len=%d\n",sizeof(list_single_t));
  18. head = malloc(sizeof(list_single_t));
  19. if(head == NULL)
  20. return NULL;
  21. memset(head,0,sizeof(list_single_t));
  22. // printf("int len=%d\n",sizeof(int *));
  23. // head->data = malloc(sizeof(int *));
  24. // if(head->data == NULL)
  25. // return NULL;
  26. // memset(head->data,0,sizeof(int *));
  27. head->next = NULL;
  28. return head;
  29. }
  30. //遍历链表
  31. void DisplayLinkList(list_single_t *head)
  32. {
  33. list_single_t *p = head->next;
  34. while (p != NULL)
  35. {
  36. printf("%d\n",p->data[0]);
  37. p = p->next;
  38. }
  39. printf("\n");
  40. }
  41. //清空链表
  42. void EmptyLinkList(list_single_t *list)
  43. {
  44. list_single_t *p = list->next;
  45. list_single_t *temp;
  46. while(p != NULL)
  47. {
  48. temp = p;
  49. p = p->next;
  50. free(temp->data);
  51. free(temp);
  52. }
  53. }
  54. //从头部插入
  55. int list_insert_head(list_single_t *head, uint8_t *data, uint16_t len)
  56. {
  57. list_single_t *p = head;
  58. list_single_t *q;
  59. q = malloc(sizeof(list_single_t));
  60. if(q == NULL)
  61. return -1;
  62. memset(q,0,sizeof(list_single_t));
  63. q->data = malloc(len);
  64. if(q->data == NULL)
  65. return -2;
  66. memset(q->data,0,len);
  67. q->len = len;
  68. memcpy(q->data,data,len);
  69. q->next = p->next;
  70. p->next = q;
  71. return 1;
  72. }
  73. //从尾部插入
  74. int list_insert_tail(list_single_t *head, uint8_t *data, uint16_t len)
  75. {
  76. list_single_t *p = head;
  77. list_single_t *q;
  78. q = malloc(sizeof(list_single_t));
  79. if(q == NULL)
  80. return -1;
  81. memset(q,0,sizeof(list_single_t));
  82. q->data = malloc(len);
  83. if(q->data == NULL)
  84. return -2;
  85. memset(q->data,0,len);
  86. q->len = len;
  87. memcpy(q->data,data,len);
  88. while (p->next!=NULL)//找到尾
  89. {
  90. p=p->next;
  91. }
  92. q->next = NULL;
  93. p->next = q;
  94. return 1;
  95. }
  96. //判断链表是否为空
  97. int8_t Check_List_Empty(list_single_t *list)
  98. {
  99. return (list == NULL || list->next==NULL);
  100. }
  101. //从头部删除数据
  102. int list_delet_head(list_single_t *list)
  103. {
  104. list_single_t *p = list;
  105. list_single_t *temp;
  106. if(Check_List_Empty(p))
  107. return -1;
  108. temp = p->next;
  109. p->next = temp->next;
  110. // printf("data len=%u\n",temp->len);
  111. // data_dump("list delet",temp->data,temp->len);
  112. free(temp->data);
  113. free(temp);
  114. return 0;
  115. }
  116. //从尾部删除数据
  117. int list_delet_tail(list_single_t *list)
  118. {
  119. list_single_t *p = list;
  120. list_single_t *temp;
  121. if(Check_List_Empty(p))
  122. return -1;
  123. while(p->next->next!=NULL)
  124. {
  125. p = p->next;
  126. }
  127. temp = p->next;
  128. p->next = temp->next;
  129. free(temp->data);
  130. free(temp);
  131. return 0;
  132. }
  133. //从头部读取数据
  134. void list_read_head(list_single_t *list, uint8_t *data, uint16_t *len)
  135. {
  136. list_single_t *p = list;
  137. list_single_t *temp;
  138. if(Check_List_Empty(p))
  139. return;
  140. temp = p->next;
  141. memcpy(data,temp->data,temp->len);
  142. *len = temp->len;
  143. return;
  144. }
  145. //从尾部读取数据
  146. void list_read_tail(list_single_t *list, uint8_t *data, uint16_t *len)
  147. {
  148. list_single_t *p = list;
  149. list_single_t *temp;
  150. if(Check_List_Empty(p))
  151. return;
  152. while(p->next->next!=NULL)
  153. {
  154. p = p->next;
  155. }
  156. temp = p->next;
  157. memcpy(data,temp->data,temp->len);
  158. *len = temp->len;
  159. return;
  160. }
  161. //uint8_t list_num = 0;
  162. //timeout_t tt_list={0xff,0,(2*1000)};
  163. //uint16_t list_len;
  164. //uint8_t list_buf[100];
  165. ////测试
  166. //void test_list(void)
  167. //{
  168. // uint16_t i,data_len;
  169. // uint8_t buf[100];
  170. // // if(list_info.insert_flag)
  171. // if(timeout_isOut(&tt_list))
  172. // {
  173. // // list_info.insert_flag = 0;
  174. // srand(TickCounter);
  175. //// data_len = rand()%64+1;
  176. // data_len = 90;
  177. // for(i = 0; i < data_len; i++)
  178. // {
  179. // srand(TickCounter+i);
  180. // buf[i] = rand()%0x100;
  181. // }
  182. // printf("list insert len=%d\n",data_len);
  183. //// data_dump("list insert",buf,data_len);
  184. //// list_insert_tail(P_list,buf,data_len);
  185. //
  186. // RS485_TX();
  187. // delay_us(200);
  188. //// uart_msg_send(UART4_ID,(char *)buf,data_len);
  189. //// delay_us(200);
  190. // uart3_dma_send((uint8_t *)buf,data_len);
  191. // data_dump("list insert",buf,data_len);
  192. //// uart3_dma_test();
  193. // // Bubble_Sort(buf,data_len);
  194. //// Bidirectional_Bubble_Sort(buf,0,data_len-1);
  195. // // Select_Sort(buf,data_len);
  196. // // Insert_Sort(buf,data_len);
  197. //// data_dump("sort",buf,data_len);
  198. // }
  199. // // if(list_info.delet_flag)
  200. // {
  201. //// if(Check_List_Empty(P_list))
  202. //// {
  203. //// // list_info.delet_flag = 0;
  204. //// // list_num = 0;
  205. //// }
  206. //// else
  207. //// {
  208. //// // printf("delet num:%d\n",list_num++);
  209. //// list_read_head(P_list,list_buf,&list_len);
  210. //// list_delet_head(P_list);
  211. //// printf("data len=%u\n",list_len);
  212. //// data_dump("list delet",list_buf,list_len);
  213. //// }
  214. // }
  215. //}
  216. //冒泡排序(从小到大)
  217. void Bubble_Sort(uint8_t *data, uint16_t len)
  218. {
  219. uint32_t i,j,temp;
  220. for(i = 0; i < len-1; i++)
  221. {
  222. for(j = 0; j < len-1-i; j++)
  223. {
  224. if(data[j] > data[j+1])//从小到大排序
  225. {
  226. temp = data[j];
  227. data[j] = data[j+1];
  228. data[j+1] = temp;
  229. }
  230. }
  231. }
  232. }
  233. //双向冒泡排序(从小到大)
  234. void Bidirectional_Bubble_Sort(uint8_t *data, uint16_t left, uint16_t right)
  235. {
  236. uint32_t i,temp;
  237. if(left >= right)
  238. return;
  239. if(left < right)
  240. {
  241. for(i = left; i < right; i++)
  242. {
  243. if(data[i] > data[i+i])//最大值移动到最右端处
  244. {
  245. temp = data[i];
  246. data[i] = data[i+1];
  247. data[i+1] = temp;
  248. }
  249. }
  250. for(i = right; i > left; i--)
  251. {
  252. if(data[i] < data[i-1])//最小值移动到最左端处
  253. {
  254. temp = data[i];
  255. data[i] = data[i-1];
  256. data[i-1] = temp;
  257. }
  258. }
  259. Bidirectional_Bubble_Sort(data,left+1,right-1);//重复运算,直到left>=right(此处使用递归调用)
  260. }
  261. }
  262. //选择排序(从小到大)
  263. void Select_Sort(uint8_t *data, uint16_t len)
  264. {
  265. uint32_t i,j,temp;
  266. for(i = 0; i < len-1; i++)
  267. {
  268. for(j = i+1; j < len; j++)
  269. {
  270. if(data[i] > data[j])
  271. {
  272. temp = data[i];
  273. data[i] = data[j];
  274. data[j] = temp;
  275. }
  276. }
  277. }
  278. }
  279. //插入排序(从小到大)
  280. void Insert_Sort(uint8_t *data, uint16_t len)
  281. {
  282. uint32_t temp;
  283. int i,j;
  284. for(i = 1; i < len; i++)
  285. {
  286. temp = data[i];
  287. j = i-1;
  288. while((j>=0) && (data[j]>temp))
  289. {
  290. data[j+1] = data[j];
  291. j--;
  292. }
  293. data[j+1] = temp;
  294. }
  295. }