doublylinkedlist.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*******************************************************************************
  2. * Copyright (c) 2017, Rockwell Automation, Inc.
  3. * All rights reserved.
  4. *
  5. ******************************************************************************/
  6. #ifndef SRC_UTILS_DOUBLYLINKEDLIST_H_
  7. #define SRC_UTILS_DOUBLYLINKEDLIST_H_
  8. /**
  9. * @file doublylinkedlist.h
  10. *
  11. * The public interface for a reference type doubly linked list
  12. */
  13. typedef struct doubly_linked_list_node DoublyLinkedListNode;
  14. typedef DoublyLinkedListNode * (*NodeMemoryAllocator)(void);
  15. typedef void (*NodeMemoryDeallocator)(DoublyLinkedListNode **node);
  16. typedef struct doubly_linked_list_node {
  17. DoublyLinkedListNode *previous;
  18. DoublyLinkedListNode *next;
  19. void *data;
  20. } DoublyLinkedListNode;
  21. typedef struct {
  22. DoublyLinkedListNode *first;
  23. DoublyLinkedListNode *last;
  24. NodeMemoryAllocator allocator;
  25. NodeMemoryDeallocator deallocator;
  26. } DoublyLinkedList;
  27. void DoublyLinkedListInitialize(DoublyLinkedList *list,
  28. NodeMemoryAllocator allocator,
  29. NodeMemoryDeallocator deallocator);
  30. void DoublyLinkedListDestroy(DoublyLinkedList *list);
  31. DoublyLinkedListNode *DoublyLinkedListNodeCreate(const void *const data,
  32. NodeMemoryAllocator const allocator);
  33. void DoublyLinkedListNodeDestroy(const DoublyLinkedList *const list,
  34. DoublyLinkedListNode **node);
  35. void DoublyLinkedListInsertAtHead(DoublyLinkedList *const list,
  36. const void *const data);
  37. void DoublyLinkedListInsertAtTail(DoublyLinkedList *const list,
  38. const void *const data);
  39. void DoublyLinkedListInsertBeforeNode(DoublyLinkedList *const list,
  40. DoublyLinkedListNode *node,
  41. void *data);
  42. void DoublyLinkedListInsertAfterNode(DoublyLinkedList *const list,
  43. DoublyLinkedListNode *node,
  44. void *data);
  45. void DoublyLinkedListRemoveNode(DoublyLinkedList *const list,
  46. DoublyLinkedListNode **pointer_to_node_pointer);
  47. #endif /* SRC_UTILS_DOUBLYLINKEDLIST_H_ */