zf_list.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. /**
  2. *****************************************************************************
  3. * @file zf_list.c
  4. * @author Zorb
  5. * @version V1.0.0
  6. * @date 2018-06-28
  7. * @brief 简单列表的实现
  8. *****************************************************************************
  9. * @history
  10. *
  11. * 1. Date:2018-06-28
  12. * Author:Zorb
  13. * Modification:建立文件
  14. *
  15. *****************************************************************************
  16. */
  17. #include "zf_list.h"
  18. #include "zf_assert.h"
  19. #include "zf_debug.h"
  20. #include "zf_malloc.h"
  21. /******************************************************************************
  22. * 描述 :创建列表(内部分配空间)
  23. * 参数 :(out)-ppList 列表指针的指针
  24. * 返回 :无
  25. ******************************************************************************/
  26. bool List_create(List **ppList)
  27. {
  28. List *pList;
  29. ZF_ASSERT(ppList != (List **)0)
  30. /* 分配空间 */
  31. pList = ZF_MALLOC(sizeof(List));
  32. if (pList == NULL)
  33. {
  34. ZF_DEBUG(LOG_E, "malloc list space error\r\n");
  35. return false;
  36. }
  37. /* 初始化成员 */
  38. pList->pRootNode = NULL;
  39. pList->Count = 0;
  40. /* 初始化方法 */
  41. pList->Add = List_add;
  42. pList->Delete = List_delete;
  43. pList->Remove = List_remove;
  44. pList->GetElementAt = List_getElementAt;
  45. pList->GetElementByData = List_getElementByData;
  46. pList->GetElementDataAt = List_getElementDataAt;
  47. pList->GetElementIndex = List_getElementIndex;
  48. pList->AddElementAt = List_addElementAt;
  49. pList->DeleteElementAt = List_deleteElementAt;
  50. pList->RemoveElementAt = List_removeElementAt;
  51. pList->Clear = List_clear;
  52. pList->Dispose = List_dispose;
  53. /* 输出 */
  54. *ppList = pList;
  55. return true;
  56. }
  57. /******************************************************************************
  58. * 描述 :在尾端增加节点
  59. * 参数 :(in)-pList 列表结构体指针
  60. * (in)-pNode 要增加的节点
  61. * 返回 :-true 成功
  62. * -false 失败
  63. ******************************************************************************/
  64. bool List_add(List * const pList, ListNode *pNode)
  65. {
  66. ZF_ASSERT(pList != (List *)0)
  67. ZF_ASSERT(pNode != (ListNode *)0)
  68. return List_addElementAt(pList, pList->Count, pNode);
  69. }
  70. /******************************************************************************
  71. * 描述 :删除节点(内部释放空间)
  72. * 参数 :(in)-pList 列表结构体指针
  73. * (in)-pNode 要删除的节点
  74. * 返回 :-true 成功
  75. * -false 失败
  76. ******************************************************************************/
  77. bool List_delete(List * const pList, ListNode *pNode)
  78. {
  79. /* 返回结果 */
  80. bool res = false;
  81. /* 要删除节点的前一个节点 */
  82. ListNode *pPreviousNode;
  83. ZF_ASSERT(pList != (List *)0)
  84. ZF_ASSERT(pNode != (ListNode *)0)
  85. /* 要删除的是根节点 */
  86. if (pNode == pList->pRootNode)
  87. {
  88. pList->pRootNode = pNode->Next;
  89. pList->Count--;
  90. /* 释放空间 */
  91. List_freeNode(pNode);
  92. res = true;
  93. }
  94. /* 要删除的不是根节点 */
  95. else
  96. {
  97. pPreviousNode = pList->pRootNode;
  98. while (pPreviousNode->Next != pNode)
  99. {
  100. pPreviousNode = pPreviousNode->Next;
  101. }
  102. /* 找到要删除的节点 */
  103. if(pPreviousNode != NULL || pPreviousNode->Next == pNode)
  104. {
  105. pPreviousNode->Next = pNode->Next;
  106. pList->Count--;
  107. /* 释放空间 */
  108. List_freeNode(pNode);
  109. res = true;
  110. }
  111. }
  112. return res;
  113. }
  114. /******************************************************************************
  115. * 描述 :移除节点(内部不释放空间)
  116. * 参数 :(in)-pList 列表结构体指针
  117. * (in)-pNode 要删除的节点
  118. * 返回 :-true 成功
  119. * -false 失败
  120. ******************************************************************************/
  121. bool List_remove(List * const pList, ListNode *pNode)
  122. {
  123. /* 返回结果 */
  124. bool res = false;
  125. /* 要移除节点的前一个节点 */
  126. ListNode *pPreviousNode;
  127. ZF_ASSERT(pList != (List *)0)
  128. ZF_ASSERT(pNode != (ListNode *)0)
  129. /* 要移除的是根节点 */
  130. if (pNode == pList->pRootNode)
  131. {
  132. pList->pRootNode = pNode->Next;
  133. pList->Count--;
  134. res = true;
  135. }
  136. /* 要移除的不是根节点 */
  137. else
  138. {
  139. pPreviousNode = pList->pRootNode;
  140. while (pPreviousNode->Next != pNode)
  141. {
  142. pPreviousNode = pPreviousNode->Next;
  143. }
  144. /* 找到要移除的节点 */
  145. if(pPreviousNode != NULL || pPreviousNode->Next == pNode)
  146. {
  147. pPreviousNode->Next = pNode->Next;
  148. pList->Count--;
  149. res = true;
  150. }
  151. }
  152. return res;
  153. }
  154. /******************************************************************************
  155. * 描述 :返回指定索引处的节点的指针
  156. * 参数 :(in)-pList 列表结构体指针
  157. * (in)-index 索引
  158. * (out)-ppNode 指定索引处的节点指针的指针
  159. * 返回 :-true 成功
  160. * -false 失败
  161. ******************************************************************************/
  162. bool List_getElementAt(List * const pList, uint32_t index,
  163. ListNode **ppNode)
  164. {
  165. /* 返回结果 */
  166. bool res = true;
  167. ListNode *pNode;
  168. uint32_t i;
  169. ZF_ASSERT(pList != (List *)0)
  170. ZF_ASSERT(index < pList->Count)
  171. pNode = pList->pRootNode;
  172. for (i = 0; i < index; i++)
  173. {
  174. if (pNode->Next == NULL)
  175. {
  176. res = false;
  177. break;
  178. }
  179. pNode = pNode->Next;
  180. }
  181. if(res == true)
  182. {
  183. *ppNode = pNode;
  184. }
  185. else
  186. {
  187. *ppNode = NULL;
  188. }
  189. return res;
  190. }
  191. /******************************************************************************
  192. * 描述 :返回数据区指向data的节点的指针
  193. * 参数 :(in)-pList 列表结构体指针
  194. * (in)-pdata 数据缓冲区指针
  195. * (out)-ppNode 节点指针的地址
  196. * 返回 :-true 成功
  197. * -false 失败
  198. ******************************************************************************/
  199. bool List_getElementByData(List * const pList, void *pdata, ListNode **ppNode)
  200. {
  201. ListNode *pNode;
  202. ZF_ASSERT(pList != (List *)0)
  203. ZF_ASSERT(pdata != (void *)0)
  204. pNode = pList->pRootNode;
  205. while (pNode != NULL)
  206. {
  207. if (pNode->pData == pdata)
  208. {
  209. /* 输出 */
  210. *ppNode = pNode;
  211. return true;
  212. }
  213. pNode = pNode->Next;
  214. }
  215. /* 输出 */
  216. *ppNode = NULL;
  217. return false;
  218. }
  219. /******************************************************************************
  220. * 描述 :返回指定索引处的节点的数据缓冲区的指针
  221. * 参数 :(in)-pList 列表结构体指针
  222. * (in)-index 索引
  223. * 返回 :-成功 数据缓冲区的指针
  224. * -失败 NULL
  225. ******************************************************************************/
  226. void *List_getElementDataAt(List * const pList, uint32_t index)
  227. {
  228. ListNode *pNode;
  229. List_getElementAt(pList, index, &pNode);
  230. if (pNode != NULL)
  231. {
  232. return (void*)pNode->pData;
  233. }
  234. return NULL;
  235. }
  236. /******************************************************************************
  237. * 描述 :返回节点的索引
  238. * 参数 :(in)-pList 列表结构体指针
  239. * (in)-pNode 节点
  240. * (out)-pIndex 节点的索引的指针
  241. * 返回 :-true 成功
  242. * -false 失败
  243. ******************************************************************************/
  244. bool List_getElementIndex(List * const pList, ListNode *pNode,
  245. uint32_t *pIndex)
  246. {
  247. /* 返回结果 */
  248. bool res = true;
  249. uint32_t index = 0;
  250. ListNode *pFindNode;
  251. ZF_ASSERT(pList != (List *)0)
  252. ZF_ASSERT(pNode != (ListNode *)0)
  253. pFindNode = pList->pRootNode;
  254. while (pFindNode != pNode && pFindNode != NULL)
  255. {
  256. pFindNode = pFindNode->Next;
  257. index++;
  258. }
  259. /* 没找到节点 */
  260. if (pFindNode != pNode)
  261. {
  262. res = false;
  263. index = 0;
  264. }
  265. /* 输出索引 */
  266. *pIndex = index;
  267. return res;
  268. }
  269. /******************************************************************************
  270. * 描述 :在指定索引处增加节点(索引超过最大值,则在尾端增加)
  271. * 参数 :(in)-pList 列表结构体指针
  272. * (in)-index 索引
  273. * (in)-pNode 要增加的节点
  274. * 返回 :-true 成功
  275. * -false 失败
  276. ******************************************************************************/
  277. bool List_addElementAt(List * const pList, uint32_t index,
  278. ListNode *pNode)
  279. {
  280. /* 返回结果 */
  281. bool res = false;
  282. /* 要增加位置的前一个节点 */
  283. ListNode *pPreviousNode;
  284. ZF_ASSERT(pList != (List *)0)
  285. ZF_ASSERT(pNode != (ListNode *)0)
  286. if (index > pList->Count)
  287. {
  288. index = pList->Count;
  289. }
  290. /* 根节点 */
  291. if (index == 0)
  292. {
  293. /* 插入节点 */
  294. pNode->Next = pList->pRootNode;
  295. pList->pRootNode = pNode;
  296. /* 数量加1 */
  297. pList->Count++;
  298. res = true;
  299. }
  300. else
  301. {
  302. /* 找要增加位置的前一个节点 */
  303. if (List_getElementAt(pList, index - 1, &pPreviousNode))
  304. {
  305. /* 插入节点 */
  306. pNode->Next = pPreviousNode->Next;
  307. pPreviousNode->Next = pNode;
  308. /* 数量加1 */
  309. pList->Count++;
  310. res = true;
  311. }
  312. }
  313. return res;
  314. }
  315. /******************************************************************************
  316. * 描述 :在指定索引处删除节点(内部释放空间)
  317. * 参数 :(in)-pList 列表结构体指针
  318. * (in)-index 索引
  319. * 返回 :-true 成功
  320. * -false 失败
  321. ******************************************************************************/
  322. bool List_deleteElementAt(List * const pList, uint32_t index)
  323. {
  324. /* 要删除的节点 */
  325. ListNode *pDeleteNode = NULL;
  326. ZF_ASSERT(pList != (List *)0)
  327. ZF_ASSERT(index < pList->Count)
  328. if (!List_getElementAt(pList, index, &pDeleteNode))
  329. {
  330. return false;
  331. }
  332. return List_delete(pList, pDeleteNode);
  333. }
  334. /******************************************************************************
  335. * 描述 :在指定索引处移除节点(内部不释放空间)
  336. * 参数 :(in)-pList 列表结构体指针
  337. * (in)-index 索引
  338. * 返回 :-true 成功
  339. * -false 失败
  340. ******************************************************************************/
  341. bool List_removeElementAt(List * const pList, uint32_t index)
  342. {
  343. /* 要移除的节点 */
  344. ListNode *pDeleteNode = NULL;
  345. ZF_ASSERT(pList != (List *)0)
  346. ZF_ASSERT(index < pList->Count)
  347. if (!List_getElementAt(pList, index, &pDeleteNode))
  348. {
  349. return false;
  350. }
  351. return List_remove(pList, pDeleteNode);
  352. }
  353. /******************************************************************************
  354. * 描述 :清空列表(内部释放空间)
  355. * 参数 :(in)-pList 列表结构体指针
  356. * 返回 :-true 成功
  357. * -false 失败
  358. ******************************************************************************/
  359. bool List_clear(List * const pList)
  360. {
  361. /* 返回结果 */
  362. bool res = true;
  363. ZF_ASSERT(pList != (List *)0)
  364. while (pList->Count)
  365. {
  366. res &= List_deleteElementAt(pList, 0);
  367. }
  368. return res;
  369. }
  370. /******************************************************************************
  371. * 描述 :释放列表(内部释放空间)
  372. * 参数 :(in)-pList 列表结构体指针
  373. * 返回 :-true 成功
  374. * -false 失败
  375. ******************************************************************************/
  376. bool List_dispose(List * const pList)
  377. {
  378. /* 返回结果 */
  379. bool res = true;
  380. ZF_ASSERT(pList != (List *)0)
  381. res = List_clear(pList);
  382. ZF_FREE(pList);
  383. return res;
  384. }
  385. /******************************************************************************
  386. * 描述 :创建节点(内部分配空间,size=0表示使用外部数据)
  387. * 参数 :(out)-ppNode 节点指针的指针
  388. * (out)-ppData 存放的数据结构指针的指针
  389. * (in)-size 存放的数据结构大小(输入0则表示不内部分配数据空间)
  390. * 返回 :-true 成功
  391. * -false 失败
  392. ******************************************************************************/
  393. bool List_mallocNode(ListNode **ppNode, void **ppData,
  394. uint32_t size)
  395. {
  396. ListNode *pNode;
  397. void *pData;
  398. ZF_ASSERT(ppNode != (ListNode **)0)
  399. pNode = (ListNode *)ZF_MALLOC(sizeof(ListNode));
  400. if (pNode == NULL)
  401. {
  402. ZF_DEBUG(LOG_E, "malloc list node space error\r\n");
  403. return false;
  404. }
  405. pNode->Next = NULL;
  406. if (size > 0)
  407. {
  408. ZF_ASSERT(ppData != (void **)0)
  409. pData = (void *)ZF_MALLOC(size);
  410. if (pData == NULL)
  411. {
  412. ZF_DEBUG(LOG_E, "malloc list node data space error\r\n");
  413. return false;
  414. }
  415. pNode->pData = pData;
  416. pNode->Size = size;
  417. pNode->IsExternData = false;
  418. /* 输出 */
  419. *ppData = pData;
  420. }
  421. else
  422. {
  423. pNode->pData = NULL;
  424. pNode->Size = 0;
  425. pNode->IsExternData = true;
  426. }
  427. /* 输出 */
  428. *ppNode = pNode;
  429. return true;
  430. }
  431. /******************************************************************************
  432. * 描述 :释放节点(不释放外部创建的数据)
  433. * 参数 :(in)-pNode 要释放的节点
  434. * 返回 :-true 成功
  435. * -false 失败
  436. ******************************************************************************/
  437. bool List_freeNode(ListNode *pNode)
  438. {
  439. ZF_ASSERT(pNode != (ListNode *)0)
  440. /* 外部创建的数据不释放 */
  441. if (!pNode->IsExternData)
  442. {
  443. ZF_FREE(pNode->pData);
  444. }
  445. ZF_FREE(pNode);
  446. return true;
  447. }
  448. /******************************** END OF FILE ********************************/