#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *next;
}node;
node *HEAD=NULL;
//Interface Functions
int insert(int value);
int insert_at(int value,int position);
int remove_at(int position);
int search(int value);
void display();
//Internal Functions
node *new_node(int data,node* link);
void get_input(char str[],int* param);
void respond(char name[],int flag);
int length();
void main()
{
int choice,value,position,flag=0;
while(1)
{
printf("\t\tSINGLE LINKED LIST OPERATIONS\n");
printf("1.Insert | 2.Insert at | 3.Remove at | 4.Search | 5.Display | 6.Exit\n");
get_input("Choice",&choice);
switch(choice)
{
case 1:
get_input("Value",&value);
flag=insert(value);
respond("Insertion",flag);
break;
case 2:
get_input("Value",&value);
get_input("Position",&position);
flag=insert_at(value,position);
respond("Insertion",flag);
break;
case 3:
get_input("Position",&position);
flag=remove_at(position);
respond("Deletion",flag);
break;
case 4:
get_input("Value",&value);
if (search(value))
printf("Element is at position %d.\n\n",search(value));
else
printf("Element not found.\n\n");
break;
case 5:
display();
break;
case 6:
exit(0);
default:
printf("Invalid Choice. Try Again.\n\n");
}
}
}
//Internal Functions
node *new_node(int value,node *link)
{
node *temp=(node *)malloc(sizeof(node));
if(temp==NULL)
{
printf("Memory allocation failure.\n\n");
exit(0);
}
temp->data=value;
temp->next=link;
return temp;
}
void get_input(char str[],int *param)
{
printf("Enter %s: ",str);
scanf("%d",param);
}
void respond(char operation[],int flag)
{
if(flag)
printf("%s Successful.\n\n",operation);
else
printf("%s not Successful.\n\n",operation);
}
int length()
{
int size;
node *temp=HEAD;
if(HEAD==NULL)
return 0;
for(size=1;temp->next!=NULL;size++)
temp=temp->next;
return size;
}
//Interface Functions
int insert(int value)
{
node *new=new_node(value,NULL);
node *temp=HEAD;
if (HEAD==NULL)
{
HEAD=new;
return 1;
}
else
{
while(temp->next!=NULL)
temp=temp->next;
temp->next=new;
return 1;
}
return 0;
}
int insert_at(int value,int position)
{
node *new=new_node(value,NULL);
node *temp=HEAD;
if (position>length())
{
if (length()==0)
{
printf("List is empty.\n");
return 0;
}
printf("Position is farther than size of list.\n");
return 0;
}
if (position==1)
{
if(HEAD==NULL)
{
HEAD=new;
return 1;
}
new->next=HEAD;
HEAD=new;
return 1;
}
if(position<=length())
{
for(int i=1;i<position-1;i++)
temp=temp->next;
new->next=temp->next;
temp->next=new;
return 1;
}
return 0;
}
int remove_at(int position)
{
node *temp=HEAD;
node *del;
if (position<=0)
{
printf("Invalid Position.\n");
return 0;
}
if (position>length())
{
if (length()==0)
{
printf("List is empty.\n");
return 0;
}
printf("Position is farther than size of list.\n");
return 0;
}
if (position==1)
{
HEAD=HEAD->next;
free(temp);
return 1;
}
if (position<=length())
{
for(int i=1;i<position-1;i++)
temp=temp->next;
del=temp->next;
if (position==length())
temp->next=NULL;
else
temp->next=del->next;
free(del);
return 1;
}
return 0;
}
int search(int value)
{
node *temp=HEAD;
int pos;
if (HEAD==NULL)
{
printf("List is empty.\n");
return 0;
}
for(pos=1;pos<=length();pos++,temp=temp->next)
if(temp->data==value)
return pos;
return 0;
}
void display()
{
node *temp=HEAD;
if(HEAD==NULL)
{
printf("List is Empty.\n\n");
return;
}
while(temp->next!=NULL)
{
printf("%d -> ",temp->data);
temp=temp->next;
}
printf("%d.\n\n",temp->data);
return;
}
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (3)
In C, you shouldn't cast the return value from malloc(3) et al.
Why ?
In C (and we're talking about C and not C++)
1) It's superfluous.
2) Can hide bugs depending upon architecture/compiler etc, where if you don't
the return type of malloc may be assumed to be int which may mean you're using a truncated address and that won't end well...