LinkedList.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include <Windows.h>
  2. #include "LinkedList.h"
  3. struct LinkedList* LinkedListCreate()
  4. {
  5. return (struct LinkedList*)GlobalAlloc(GPTR, sizeof(struct LinkedList));
  6. }
  7. void LinkedListDestroy(struct LinkedList** ppList, LinkedListDestroyCallback callback)
  8. {
  9. if (ppList && *ppList)
  10. {
  11. struct LinkedListNode* pNode = (*ppList)->First;
  12. while (pNode)
  13. {
  14. struct LinkedListNode* pNext = pNode->Next;
  15. if (callback)
  16. callback(pNode);
  17. GlobalFree(pNode->Key);
  18. GlobalFree(pNode);
  19. pNode = pNext;
  20. }
  21. GlobalFree(*ppList);
  22. *ppList = NULL;
  23. }
  24. }
  25. void LinkedListDelete(struct LinkedList** ppList, const PTCHAR szKey)
  26. {
  27. if (ppList && *ppList)
  28. {
  29. struct LinkedListNode* pNode = (*ppList)->First;
  30. struct LinkedListNode* pPrev = NULL;
  31. PTCHAR pszKey = szKey ? szKey : TEXT("");
  32. while (pNode)
  33. {
  34. struct LinkedListNode* pNext = pNode->Next;
  35. if (lstrcmpi(pNode->Key, pszKey) == 0)
  36. {
  37. if (pPrev)
  38. pPrev->Next = pNext;
  39. if ((*ppList)->First == pNode)
  40. {
  41. GlobalFree(*ppList);
  42. *ppList = NULL;
  43. }
  44. GlobalFree(pNode->Key);
  45. GlobalFree(pNode);
  46. break;
  47. }
  48. pPrev = pNode;
  49. pNode = pNext;
  50. }
  51. }
  52. }
  53. struct LinkedListNode* LinkedListGet(struct LinkedList* pList, const PTCHAR szKey, const BOOL bCreate)
  54. {
  55. if (pList)
  56. {
  57. struct LinkedListNode* pNode = pList->First;
  58. PTCHAR pszKey = szKey ? szKey : TEXT("");
  59. while (pNode)
  60. {
  61. if (lstrcmpi(pNode->Key, pszKey) == 0)
  62. return pNode;
  63. pNode = pNode->Next;
  64. }
  65. if (bCreate)
  66. {
  67. pNode = (struct LinkedListNode*)GlobalAlloc(GPTR, sizeof(struct LinkedListNode));
  68. pNode->Key = (PTCHAR)GlobalAlloc(GPTR, sizeof(TCHAR) * (lstrlen(pszKey) + 1));
  69. lstrcpy(pNode->Key, pszKey);
  70. pNode->Next = pList->First;
  71. pList->First = pNode;
  72. return pNode;
  73. }
  74. }
  75. return NULL;
  76. }