Reputation: 605
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
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);
#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
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
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