linkedList.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #define LINKED_LIST
  2. struct listElement {
  3. void * data;
  4. struct listElement *next;
  5. struct listElement *previous;
  6. };
  7. typedef struct listElement LISTEL;
  8. LISTEL * insertBefore(void *theData, LISTEL *place)
  9. {
  10. LISTEL * element = malloc(sizeof(LISTEL));
  11. element->data = theData;
  12. if(place->previous == NULL)
  13. {
  14. element->next = place;
  15. place->previous = element;
  16. }
  17. else
  18. {
  19. LISTEL * previous = place->previous;
  20. previous->next = element;
  21. element->previous = previous;
  22. place->previous = place;
  23. element->next = place;
  24. }
  25. return element;
  26. }
  27. LISTEL * insertAfter(void *theData, LISTEL *place)
  28. {
  29. LISTEL * element = malloc(sizeof(LISTEL));
  30. element->data = theData;
  31. if(place->next == NULL)
  32. {
  33. element->previous = place;
  34. place->next = element;
  35. }
  36. else
  37. {
  38. LISTEL * next = place->next;
  39. next->previous = element;
  40. element->next = next;
  41. place->next = element;
  42. element->previous = place;
  43. }
  44. return element;
  45. }
  46. LISTEL * circularizeList(LISTEL *start)
  47. {
  48. LISTEL *tail = start;
  49. while (tail->next != NULL)
  50. tail = tail->next;
  51. start->previous = tail;
  52. tail->next = start;
  53. return start;
  54. }
  55. void * removeElement(LISTEL *remove)
  56. {
  57. LISTEL *before = remove->previous;
  58. LISTEL *after = remove->next;
  59. void * value = remove->data;
  60. before->next = after;
  61. after->previous = before;
  62. free(remove);
  63. return value;
  64. }