/*
Write a program of single linked list with header node.
*/
#include<stdio.h>
#include<stdlib.h>
struct node
{
int info;
struct node *link;
};
struct node *create_list(struct node *head);
void display(struct node *head);
struct node *addatend(struct node *head,int data);
struct node *addbefore(struct node *head,int data,int item );
struct node *addatpos(struct node *head,int data,int pos);
struct node *del(struct node *head,int data);
struct node *reverse(struct node *head);
main()
{
int choice,data,item,pos;
struct node *head;
head=(struct node *)malloc(sizeof(struct node));
head->info=0;
head->link=NULL;
head=create_list(head);
while(1)
{
printf("1.Display\n");
printf("2.Add at end\n");
printf("3.Add before node\n");
printf("4.Add at position\n");
printf("5.Delete\n");
printf("6.Reverse\n");
printf("7.Quit\n\n");
printf("Enter your choice : ");
scanf("%d",&choice);
switch(choice)
{
case 1:
display(head);
break;
case 2:
printf("Enter the element to be inserted : ");
scanf("%d",&data);
head=addatend(head,data);
break;
case 3:
printf("Enter the element to be inserted : ");
scanf("%d",&data);
printf("Enter the element before which to insert : ");
scanf("%d",&item);
head=addbefore(head,data,item);
break;
case 4:
printf("Enter the element to be inserted : ");
scanf("%d",&data);
printf("Enter the position at which to insert : ");
scanf("%d",&pos);
head=addatpos(head,data,pos);
break;
case 5:
printf("Enter the element to be deleted : ");
scanf("%d",&data);
head=del(head,data);
break;
case 6:
head=reverse(head);
break;
case 7:
exit(1);
default:
printf("Wrong choice\n\n");
}
}
}
struct node *create_list(struct node *head)
{
int i,n,data;
printf("Enter the number of nodes : ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Enter the element to be inserted : ");
scanf("%d",&data);
head=addatend(head,data);
}
return head;
}
void display(struct node *head)
{
struct node *p;
if(head->link==NULL)
{
printf("List is empty\n");
return;
}
p=head->link;
printf("List is :\n");
while(p!=NULL)
{
printf("%d ",p->info);
p=p->link;
}
printf("\n");
}
struct node *addatend(struct node *head,int data)
{
struct node *p,*tmp;
tmp= (struct node *)malloc(sizeof(struct node));
tmp->info=data;
p=head;
while(p->link!=NULL)
p=p->link;
p->link=tmp;
tmp->link=NULL;
return head;
}
struct node *addbefore(struct node *head,int data,int item)
{
struct node *tmp,*p;
p=head;
while(p->link!=NULL)
{
if(p->link->info==item)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->info=data;
tmp->link=p->link;
p->link=tmp;
return head;
}
p=p->link;
}
printf("%d not present in the list\n",item);
return head;
}
struct node *addatpos(struct node *head,int data,int pos)
{
struct node *tmp,*p;
int i;
tmp=(struct node *)malloc(sizeof(struct node) );
tmp->info=data;
p=head;
for(i=1;i<=pos-1;i++)
{
p=p->link;
if(p==NULL)
{
printf("There are less than %d elements\n",pos);
return head;
}
}
tmp->link=p->link;
p->link=tmp;
return head;
}
struct node *del(struct node *head, int data)
{
struct node *tmp,*p;
p=head;
while(p->link!=NULL)
{
if(p->link->info==data)
{
tmp=p->link;
p->link=tmp->link;
free(tmp);
return head;
}
p=p->link;
}
printf("Element %d not found\n",data);
return head;
}
struct node *reverse(struct node *head)
{
struct node *prev, *ptr, *next;
prev=NULL;
ptr=head->link;
while(ptr!=NULL)
{
next=ptr->link;
ptr->link=prev;
prev=ptr;
ptr=next;
}
head->link=prev;
return head;
}
0 Comments