Sunday, July 17, 2016

C Linked List Operations : Insert, Delete, Show, Size, Delete at Position, Insert at position

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int gDebug=0;

struct node
{
int data;
struct node *next;
};
struct node *start=NULL;
struct node *temp=NULL;

void insert(int data)
{
struct node *temp1,*ptr;
temp1=malloc(sizeof(struct node *));
ptr=start;
if(NULL == start)
{
temp1->data=data;
temp1->next=NULL;
start=temp1;
}
else
{
while(ptr->next != NULL)
{
ptr=ptr->next;
}
ptr->next=temp1;
temp1->next=NULL;
temp1->data=data;
}

}
void display()
{
struct node *ptr;
ptr=start;
if(NULL == ptr )
{
printf("Linked list is empty\n");
}
else
{
while(ptr->next != NULL)
{
printf("Element is [%d]\n",ptr->data);
ptr=ptr->next;
}
printf("Element is [%d]\n",ptr->data);

}
}
void delete_at_beg()
{
struct node *ptr;
ptr=start;
if(NULL == ptr )
{
printf("Cannot delete: Linked list is empty\n");
}
else
{
free(start);
ptr=ptr->next;
start=ptr;
}
}
void delete_at_end()
{
struct node *ptr;
ptr=start;
if(NULL == ptr )
{
printf("Cannot delete at end : Linked list is empty\n");
}
else
{
if(ptr->next !=NULL )
{
printf("ptr->next !=NULL\n");
while(ptr->next->next !=NULL)
{
ptr=ptr->next;
}
free(ptr->next->next);
ptr->next=NULL;
}
else
{
printf("ptr->next ==NULL\n");
free(ptr->next);
start=NULL;
}
}

}
int showSize()
{
int lLinkedListLen=0;
struct node *temp;
temp=start;
if(NULL ==temp )
{
return 0;
}
else
{
while(temp->next != NULL )
{
temp=temp->next;
lLinkedListLen++;
}
lLinkedListLen++;
}
return lLinkedListLen;
}
void insert_at_beg()
{
int lData;
struct node *temp;
struct node *temp1;
temp1=malloc(sizeof(struct node *));
printf("Enter data:\t");
scanf("%d",&lData);
if(NULL == start )
{
temp1->data=lData;
temp1->next=NULL;
start=temp1;
}
else
{
temp1->data=lData;
temp1->next=start;
start=temp1;
}
}
void insert_at_pos(int lPos,int lData)
{
int lLinkedListLen=0;
int lCount=0;
struct node *temp1,*prev;
struct node *ptr;
lLinkedListLen=showSize();
if( 0 == lPos)
{
if(NULL == start )
{
temp1->data=lData;
temp1->next=NULL;
start=temp1;
}
else
{
temp1->data=lData;
temp1->next=start;
start=temp1;
}
}
else
{
temp1=malloc(sizeof(struct node *));
ptr=start;
while(lCount != (lPos))
{
prev=ptr;
ptr=ptr->next;
lCount++;
}
temp1->data=lData;
temp1->next=ptr;
prev->next=temp1;
}
}
int main()
{
int lChoice;
int lData;
int lLinkedListLength=0;
int lPos;
while(1)
{
printf("\n\nLinked List Operations\n 1.Insert\n 2.Display\n 3.Delete at beg\n 4.Delete at end\n 5.Show Size\n 6.Insert at beg\n 7.Insert at pos\n 8.Exit\n Enter your Choice:\t");
scanf("%d",&lChoice);
switch(lChoice)
{
case 1:
printf("Enter Data:\t");
scanf("%d",&lData);
insert(lData);
break;
case 2:
display();
break;
case 3:
delete_at_beg();
break;
case 4:
delete_at_end();
break;
case 5:
lLinkedListLength=showSize();
if(1 == gDebug)
printf("Length of Linked list is ::  [%d]\n",lLinkedListLength);
break;
case 6:
if(1 == gDebug)
printf("CALL INSERT AT BEG\n");
insert_at_beg();
break;
case 7:
printf("Enter the position at which you want to enter:\t");
scanf("%d",&lPos);
printf("Enter data:\t");
scanf("%d",&lData);
insert_at_pos(lPos,lData);
break;
case 8:
exit(0);
break;
default:
printf("Invalid Choice....Exiting !!!\n");
break;
}
}
return 0;
}