Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef enum { FAIL, SUCCESS } Status;
  5. typedef int ElemType;
  6. typedef struct node {
  7. ElemType value;
  8. struct node *prev, *next;
  9. } Node, DoubleLinkedList;
  10.  
  11. /* initialize a double linked list */
  12. Status double_linked_list_init(DoubleLinkedList* dlist) {
  13. // use head node's value to store list length
  14. dlist->value = 0;
  15. dlist->prev = dlist->next = dlist;
  16. return SUCCESS;
  17. }
  18.  
  19. /* insert a node into the double linked list at the given index */
  20. Status double_linked_list_insert(DoubleLinkedList* dlist, int index,
  21. ElemType value) {
  22. // index out of range
  23. if (index < 0 || index > dlist->value) return FAIL;
  24. Node *predecessor = dlist, *current = (Node*)malloc(sizeof(Node));
  25. // find the predecessor node
  26. while (index--) predecessor = predecessor->next;
  27. // insert the current node
  28. current->value = value;
  29. current->next = predecessor->next;
  30. predecessor->next->prev = current;
  31. current->prev = predecessor;
  32. predecessor->next = current;
  33. dlist->value++;
  34. return SUCCESS;
  35. }
  36.  
  37. /* delete a node from the double linked list at the give index */
  38. Status double_linked_list_delete(DoubleLinkedList* dlist, int index) {
  39. if (index < 0 || index >= dlist->value) return FAIL;
  40. Node *predecessor = dlist, *current = NULL;
  41. // find the predecessor node
  42. while (index--) predecessor = predecessor->next;
  43. // delete the current node
  44. current = predecessor->next;
  45. predecessor->next = current->next;
  46. current->next->prev = predecessor;
  47. free(current);
  48. dlist->value--;
  49. return SUCCESS;
  50. }
  51.  
  52. int main() {
  53. DoubleLinkedList dlist;
  54. double_linked_list_init(&dlist);
  55. int i;
  56. // test list insert operation
  57. for (i = 0; i < 5; i++)
  58. double_linked_list_insert(&dlist, dlist.value, i);
  59. // test list delete operation
  60. double_linked_list_delete(&dlist, 2);
  61. Node *current = dlist.next;
  62. // test list forward iteration
  63. for (i = 0; i < dlist.value; i++, current = current->next)
  64. printf("%d ", current->value);
  65. current = current->prev;
  66. // test list backward iteration
  67. for (i = 0; i < dlist.value; i++, current = current->prev)
  68. printf("%d ", current->value);
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement