This is single linked list implementation in C. It contains all the possible operations in single linked list.
#include<stdio.h>
#include<stdlib.h>
//linked list structure
struct node
{
int info;
struct node *next;
};
//making typdef so we can use Node instead of 'struct node'
typedef struct node Node;
//inserting or creating the list or adding the element @ end
Node* insert(Node *h, int info)
{
Node *tempHead=h;
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->info = info;
newNode->next = NULL;
if(tempHead == NULL) // if the list has zero elements. make new node as a head
{
h=newNode;
}
else if(tempHead->next==NULL) // if the list is having only one node
{
tempHead->next = newNode;
}
else
{
Node *tempNode = h;
while(tempNode->next != NULL) // if the list has more than one node, so moving to the last node
{
tempNode = tempNode->next;
}
tempNode->next = newNode; // appending the new node at the end
}
return h;
}
//deleting a node from list. It has three cases
//1. empty list
//2. deleting first node in the list (this is similar to deleting current node in the list)
//3. other than first node
void deleteNode(Node *head, int info)
{
Node *h = head;
Node *temp=NULL;
if(h==NULL)
{
printf("Linked list is empty\n");
return ;
}
if(head->info == info)
{
if(head->next == NULL)
head = NULL;
else
{
head->info = head->next->info;
temp = head->next;
head->next = head->next->next;
free(temp);
h = head->next;
}
printf("----------------- given %d element is deleted from the list----------------- \n",info);
return ;
}
while(h->next!=NULL)
{
if((h->next->info == info))
{
temp = h->next;
h->next=h->next->next;
free(temp);
printf("----------------- given %d element is deleted from the list----------------- \n",info);
return;
}
h=h->next;
}
printf("-------------- %d is not in the list ------------\n",info);
return ;
}
//deleting current node
void deleteCurrent(Node *current)
{
current->info = current->next->info;
current->next = current->next->next;
}
/*****************************************************************************
for displaying the nodes in the list
*****************************************************************************/
void display(Node *h)
{
Node *temp = h;
while (temp->next!=NULL)
{
printf("%d->",temp->info);
temp = temp->next;
}
printf("%d\n",temp->info);
}
//reversing a linked list
Node *reverseList(Node *head)
{
Node *newHead,*temp;
temp = head;
newHead = head;
if(newHead == temp)
{
temp=head->next;
head = head->next;
newHead->next = NULL;
}
while(head!=NULL)
{
temp=head->next;
head->next = newHead;
newHead = head;
head = temp;
}
return newHead;
}
// looking for a element in the list
void search(Node *head, int element)
{
Node *tmp = head;
while(tmp)
{
if(tmp->info == element)
{
printf("%d found in the list\n",element);
break;
}
tmp=tmp->next;
}
printf("%d not found in the list\n",element);
}
//finding the size of the linked list
int listSize(Node *head)
{
Node *tmp = head;
int size=0;
while(tmp)
{
size++;
tmp=tmp->next;
}
return size;
}
//adding the new node to a linked list @specified position
Node *add(Node *head,int element, int location)
{
Node *tmp = head;
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->info = element;
newNode->next = NULL;
if(!location)
{
newNode->next = head;
head = newNode;
return head;
}
while(tmp!=NULL)
{
if(!location)
{
newNode->next = tmp->next;
tmp->next = newNode;
}
tmp = tmp->next;
location--;
}
return head;
}
int main()
{
Node *head = NULL;
int i,n,element,choice,pos,size;
printf("Enter no. of elements in the list\n");
scanf("%d",&n);
printf("Enter the elements in the list\n");
// printf("info value is %d\n",head->info);
for (i=0;i<n;i++)
{
scanf("%d",&element);
head = insert(head,element);
}
printf("Below are the operation we can perform on the linked list\n");
printf("1. Adding Element\n2. Deleting Element\n3. Display list\n4. Reverse list\n5. Finding element\n6. Finding nth element from last\n");
printf("7. Linked list Size\n8. Exit\n");
scanf("%d",&choice);
while(choice!=8)
{
switch(choice)
{
case 1:
printf("Enter the element to add to the list\n");
scanf("%d",&element);
printf("Enter the position where to ad the element \n");
scanf("%d",&pos);
head = add(head,element,pos);
break;
case 2:
printf("Enter the element to delete from the list\n");
scanf("%d",&element);
deleteNode(head,element);
break;
case 3:
printf("----------------- list of elements in the linked list are----------------- \n");
display(head);
printf("----------------- ----------------- ----------------- ----------------- \n");
break;
case 4:
head=reverseList(head);
printf("----------------- given linked list is reversed ----------------- \n");
break;
case 5:
printf("Enter the element to be searched in the list\n");
scanf("%d",&element);
search(head,element);
break;
case 6:
printf("Enter the position from last\n");
scanf("%d",&pos);
Node *tmp=nthFrmLast(head,pos);
if(tmp)
printf("%dth element from last is %d\n",pos,tmp->info);
else
printf("enter the pos less the list size\n");
break;
case 7:
size = listSize(head);
if(size)
printf("----------------- linked list size is %d----------------- \n",size);
else
printf("----------------- list is empty----------------- \n");
break;
case 8:
return 0;
break;
default:
printf("Enter the choice between 1-9 only\n");
break;
}
printf("1. Adding Element\n2. Deleting Element\n3. Display list\n4. Reverse list\n5. Finding element\n6. Finding nth element from last\n");
printf("7. Linked list Size\n8. Exit\n");
scanf("%d",&choice);
}
}
No comments:
Post a Comment