title: How to make a function that inserts a node into the front of this queue?
body: <p>This is code is from geeksforgeeks, and I'm trying to use it for a round robin scheduler. Normally, the function enQueue() adds the node to the back of the queue, and since I didn't write this, I'm unsure of how to modify the push() function to insert to the back. My only attempt kept resulting in a segfault. </p>
  
  <pre><code>/* Program to implement a queue using one user defined stack  
  and one Function Call Stack */
  #include &lt;stdio.h&gt; 
  #include &lt;stdlib.h&gt; 
  
  /* structure of a stack node */
  struct sNode { 
      int data; 
      struct sNode* next; 
  }; 
  
  /* structure of queue having two stacks */
  struct queue { 
      struct sNode* stack1; 
  }; 
  
  /* Function to push an item to stack*/
  void push(struct sNode** top_ref, int new_data); 
  
  /* Function to pop an item from stack*/
  int pop(struct sNode** top_ref); 
  
  /* Function to enqueue an item to queue */
  void enQueue(struct queue* q, int x) 
  { 
      push(&amp;q-&gt;stack1, x); 
  } 
  
  /* Function to deQueue an item from queue */
  int deQueue(struct queue* q) 
  { 
      int x, res; 
  
      /* If both stacks are empty then error */
      if (q-&gt;stack1 == NULL) { 
          printf("Q is empty"); 
          getchar(); 
          exit(0); 
      } 
      else if (q-&gt;stack1-&gt;next == NULL) { 
          return pop(&amp;q-&gt;stack1); 
      } 
      else { 
          /* pop an item from the stack1 */
          x = pop(&amp;q-&gt;stack1); 
  
          /* store the last deQueued item */
          res = deQueue(q); 
  
          /* push everything back to stack1 */
          push(&amp;q-&gt;stack1, x); 
          return res; 
      } 
  } 
  
  /* Function to push an item to stack*/
  void push(struct sNode** top_ref, int new_data) 
  { 
      /* allocate node */
      struct sNode* new_node = (struct sNode*)malloc(sizeof(struct sNode)); 
  
      if (new_node == NULL) { 
          printf("Stack overflow \n"); 
          getchar(); 
          exit(0); 
      } 
  
      /* put in the data */
      new_node-&gt;data = new_data; 
  
      /* link the old list off the new node */
      new_node-&gt;next = (*top_ref); 
  
      /* move the head to point to the new node */
      (*top_ref) = new_node; 
  } 
  
  /* Function to pop an item from stack*/
  int pop(struct sNode** top_ref) 
  { 
      int res; 
      struct sNode* top; 
  
      /*If stack is empty then error */
      if (*top_ref == NULL) { 
          printf("Stack underflow \n"); 
          getchar(); 
          exit(0); 
      } 
      else { 
          top = *top_ref; 
          res = top-&gt;data; 
          *top_ref = top-&gt;next; 
          free(top); 
          return res; 
      } 
  } 
  
  /* Driver function to test above functions */
  int main() 
  { 
      /* Create a queue with items 1 2 3*/
      struct queue* q = (struct queue*)malloc(sizeof(struct queue)); 
      q-&gt;stack1 = NULL; 
  
      enQueue(q, 1); 
      enQueue(q, 2); 
      enQueue(q, 3); 
  
      /* Dequeue items */
      printf("%d ", deQueue(q)); 
      printf("%d ", deQueue(q)); 
      printf("%d ", deQueue(q)); 
  
      return 0; 
  } 
  </code></pre>