user2227862
user2227862

Reputation: 605

Implementation of queue using linked list in c

I am trying to implement queue using a linked list. I am using the following code but my display function is not working properly:

What is wrong with my code?

My Code:

#include<stdio.h>
#include<stdlib.h>

struct node
{
    int info;
    struct node *link;
}*front=NULL,*rear=NULL;

void insert(int item);
int del();
int peek();
int isEmpty();
void display();

main()
{
    int choice,item;
    while(1)
    {       
        printf("1.Insert\n");
        printf("2.Delete\n");
        printf("3.Display the element at the front\n");
        printf("4.Display all elements of the queue\n");
        printf("5.Quit\n");
        printf("Enter your choice : ");
        scanf("%d", &choice);

        switch(choice)
        {
        case 1:
            printf("Input the element for adding in queue : ");
            scanf("%d",&item);
            insert(item);
            break;
        case 2:
            printf("Deleted element is  %d\n",del());
            break;
        case 3:
            printf("Element at the front of the queue is %d\n", peek() );
            break;
        case 4:
            display();
            break;
        case 5:
            exit(1);
        default :
            printf("Wrong choice\n");
        }
    }
}

void insert(int item)
{
    struct node *tmp;
    tmp=(struct node *)malloc(sizeof(struct node));
    if(tmp==NULL)
    {
        printf("Memory not available\n");
        return;
    }
    tmp->info = item;
    tmp->link=NULL;
    if(front==NULL)      /*If Queue is empty*/
        front=tmp;
    rear=tmp;
}

int del()
{
    struct node *tmp;
    int item;
    if( isEmpty( ) )
    {
        printf("Queue Underflow\n");
        exit(1);
    }
    tmp=front;
    item=tmp->info;
    front=front->link;
    free(tmp);
    return item;
}

int peek()
{
    if( isEmpty( ) )
    {
        printf("Queue Underflow\n");
        exit(1);
    }
    return front->info;
}

int isEmpty()
{
    if(front==NULL)
        return 1;
    else
        return 0;

}

void display()
{
    struct node *ptr;
    ptr=front;
    if(isEmpty())
    {
        printf("Queue is empty\n");
        return;
    }
    printf("Queue elements :\n\n");
    while(ptr!=NULL)
    {
        printf("%d ",ptr->info);
        ptr=ptr->link;
    }
    printf("\n\n");
}

Upvotes: 1

Views: 23313

Answers (3)

rashedcs
rashedcs

Reputation: 3725

  Enqueue Algorithm :
   1. Create a newNode with data and address.
   2. if queue i.e front is empty   
    i.  front = newnode;   
    ii. rear  = newnode;
   3. Else 
   i.rear->next = newnode;    
   ii.rear = newnode;

 Dequeue Algorithm :
   1. if queue is i.e front is NULL      printf("\nQueue is Empty \n");
   2. Else next element turn into front        
   i.  struct node *temp = front ;  
   ii. front = front->next;   
   iii.free(temp);  

C programming implementation :

   #include<stdio.h>
   #include<stdlib.h>

    struct node
    {
      int data;
      node *next;
    };

    node *front = NULL;
    node *rear =NULL;


    node *creation(int data)
    {
      tmp=(struct node *)malloc(sizeof(struct node));
      tmp->data = data;
      tmp->next=NULL;
      return tmp;
    }




     void Insert(int item)
     {
         struct node *newnode = creation(item);

       if(front==NULL)
       {
          front = rear = newnode;
       }

       else
       {
          rear->next = newnode;
          rear = newnode;
       }
  }





    void Delete()
    {
      struct node *temp;

      if (front == NULL)
      {
        printf("\nQueue is Empty \n");
        return;
      }

      else
      {
         temp = front;
         front = front->next;
         if(front == NULL)  rear = NULL;
         free(temp);
      }
   }


     void display()
     {

       struct node *temp=front;

      if(front == NULL) 
      {
        printf("Queue is Overflow\n");
      }

     else
     {
         printf("Queue is :\n");
         while(temp != NULL)
         {
             printf("%d ", temp->data);
             temp = temp->next;
         }
     }
     printf("\n");
   }

Upvotes: 1

poorvank
poorvank

Reputation: 7602

Modify your insert function as:

if(front==NULL)      /*If Queue is empty*/
        front=tmp;
else
    rear->link = tmp;
/*The above statement would link the the previous node to the newly created node*/
    rear=tmp;

Upvotes: 3

Some programmer dude
Some programmer dude

Reputation: 409146

Your insert function doesn't link the new nodes into the list properly. You just set the tail to point to the new node, but you don't make the previous tail node link point to the new tail.

Upvotes: 4

Related Questions