Advertisement
Iam_Sandeep

Untitled

Sep 2nd, 2021
1,387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.85 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <malloc.h>
  5. // Node of a doubly linked list.
  6. struct Node {
  7.     int key;
  8.     struct Node * next; // Pointer to next node in DLL.
  9.     struct Node * prev; // Pointer to previous node in DLL.
  10. };
  11.  
  12. struct LinkedList {
  13.     struct Node * head;
  14.     struct Node * tail;
  15. };
  16.  
  17. typedef struct Node Node;
  18. typedef struct LinkedList LinkedList;
  19.  
  20. // Function Prototype or method on linked list.
  21. LinkedList * create_list(void); // Initiate a linked list.
  22. unsigned is_empty(LinkedList *); // Check if a linked list is empty or no.
  23. void insert_first(LinkedList *, int); // Add a node in the beginning.
  24. void insert_last(LinkedList *, int); // Add a node in the end.
  25. void insert_after(LinkedList *, Node *, int key); // Add a node after a given node.
  26. void insert_before(LinkedList *, Node *, int key); // Add a node before a given node.
  27. Node * find_node(Node *, int); // Check if a given key exist or no.
  28. void show(Node *); // Higher order function to be used in traverse: show node's key.
  29. void traverse_forward(Node *, void (*callback)(Node *)); // Forward Traverse the linked list starting from a given Node.
  30. void traverse_backward(Node *, void (*callback)(Node *)); // Backward Traverse the linked list starting from a given Node.
  31. void remove_succesor(Node *); // Remove the successor of a Node.
  32. void remove_node(Node *); // Remove Node from the list.
  33. void remove_head(LinkedList *); // Remove a node from the beginning.
  34. void remove_tail(LinkedList *); // Remove a node from the end.
  35.  
  36. LinkedList * create_list() {
  37.     LinkedList *ll ;
  38.     ll = (LinkedList *)malloc(sizeof(LinkedList)) ;
  39.     ll -> head = NULL ;
  40.     ll -> tail = NULL ;
  41.     return ll ;
  42. }
  43.  
  44. unsigned is_empty(LinkedList * ll) {
  45.     return (ll -> head == NULL) && (ll -> tail == NULL);
  46. }
  47.  
  48. void insert_first(LinkedList * ll, int key) {
  49.     // Dynamic allocate node.
  50.     Node * nd;
  51.     nd = (Node *)malloc(sizeof(Node));
  52.     // put in the data.
  53.     nd -> key = key;
  54.     // Make next of new node as head.
  55.     nd -> next = ll -> head;
  56.     // Make previous of new node as NULL.
  57.     nd -> prev = NULL;
  58.     // If list is empty make the tail point to the new node.
  59.     if (is_empty(ll))
  60.         ll -> tail = nd;
  61.     else
  62.         // change prev of head node to new node.
  63.         ll -> head -> prev = nd;
  64.     // move the head to point to the new node.
  65.     ll -> head = nd;
  66. }
  67.  
  68. void insert_last(LinkedList * ll, int key) {
  69.     // Dynamic allocate node.
  70.     Node * nd;
  71.     nd = (Node *)malloc(sizeof(Node));
  72.     // put in the data.
  73.     nd -> key = key;
  74.     // This new node is going to be the last node, so next of it is NULL.
  75.     nd -> next = NULL;
  76.     // If the Linked List is empty, then the new node is head and tail.
  77.     if (is_empty(ll)) {
  78.         nd -> prev = NULL;
  79.         ll -> head = nd;
  80.         ll -> tail = nd;
  81.     } else {
  82.         // Make previous of new node as tail.
  83.         nd -> prev = ll -> tail;
  84.         // change next of tail node to new node.
  85.         ll -> tail -> next = nd;
  86.         // move the prev to point to the new node.
  87.         ll -> tail = nd;
  88.     }
  89.    
  90.  
  91. }
  92.  
  93. void insert_after(LinkedList * ll, Node * nd, int key) {
  94.     // Dynamic allocate node.
  95.     Node * temp_nd;
  96.     temp_nd =(Node*) malloc(sizeof(Node));
  97.     // put in the data.
  98.     temp_nd -> key = key;
  99.     // Make next of new node as next of nd.
  100.     temp_nd -> next = nd -> next;
  101.     // Change previous of new nd's next node to the new node.
  102.     if (temp_nd -> next != NULL)
  103.         nd -> next -> prev = temp_nd;
  104.    
  105.     // Make the next of nd as new node.
  106.     nd -> next = temp_nd;
  107.     // Make nd as previous of new node.
  108.     temp_nd -> prev = nd;
  109.     if (temp_nd -> next == NULL)
  110.         // If the next of new node is NULL, it will be  the new tail node.
  111.         ll -> tail = temp_nd;
  112. }
  113.  
  114. void insert_before(LinkedList * ll, Node * nd, int key) {
  115.     // Dynamic allocate node.
  116.     Node * temp_nd;
  117.     temp_nd =(Node*) malloc(sizeof(Node));
  118.     // put in the data.
  119.     temp_nd -> key = key;
  120.     // Make prev of new node as prev of nd.
  121.     temp_nd -> prev = nd -> prev;
  122.     // Change next of nd's previous node to the new node.
  123.     if (temp_nd -> prev != NULL)
  124.         nd -> prev -> next = temp_nd;
  125.     // Make the prev of nd as new node.
  126.     nd -> prev = temp_nd;
  127.     // Make nd as next of new node.
  128.     temp_nd -> next = nd;
  129.  
  130.     if (temp_nd -> prev == NULL)
  131.         // If the previous of new node is NULL, it will be  the new head node.
  132.         ll -> head = temp_nd;
  133. }
  134.  
  135. Node * find_node(Node * nd, int key) {
  136.     while (nd && nd -> key != key) {
  137.         nd = nd -> next;
  138.     }
  139.     return nd;
  140. }
  141.  
  142. void traverse_forward(Node * nd, void(*callback)(Node *)) {
  143.     while (nd) {
  144.         (*callback)(nd);
  145.         nd = nd -> next;
  146.     }
  147. }
  148.  
  149. void traverse_backward(Node * nd, void(*callback)(Node *)) {
  150.     while (nd) {
  151.         (*callback)(nd);
  152.         nd = nd -> prev;
  153.     }
  154. }
  155.  
  156. void show(Node * nd) {
  157.     printf("%d -- ", nd -> key);
  158. }
  159.  
  160. void remove_succesor(Node * nd) {
  161.     Node * temp_nd;
  162.     temp_nd = nd -> next;
  163.     nd -> next = temp_nd -> next;
  164.     temp_nd -> next -> prev = nd;
  165.     free(temp_nd);
  166. }
  167.  
  168. void remove_node(Node * nd) {
  169.     if (nd -> next != NULL)
  170.         nd -> next -> prev = nd -> prev;
  171.     if (nd -> prev != NULL)
  172.         nd -> prev -> next = nd -> next;
  173.     free(nd);
  174. }
  175.  
  176. void remove_head(LinkedList * ll) {
  177.     Node * nd;
  178.     nd = ll -> head;
  179.     ll -> head = nd -> next;
  180.     free(nd);
  181.     if (ll -> head == NULL)
  182.         ll -> tail = NULL;
  183.     else
  184.         ll -> head -> prev = NULL;
  185. }
  186.  
  187. void remove_tail(LinkedList * ll) {
  188.     Node * nd;
  189.     if (ll -> head == ll -> tail)
  190.         remove_head(ll);
  191.     else {
  192.         nd = ll -> head;
  193.         while(nd ->next != ll -> tail)
  194.             nd = nd -> next;
  195.         nd -> next = NULL;
  196.         free(ll -> tail);
  197.         ll -> tail = nd;
  198.     }
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement