Untitled

 avatar
unknown
plain_text
2 months ago
9.3 kB
2
Indexable
//All operations on a singly linked list

#include<stdio.h>  
#include<stdlib.h> 

void create();
void display();
void insert_at_begin();
void insert_at_end();
void insert_at_middle();
void delete_from_begin();
void delete_from_end();
void delete_from_middle();
void delete_list();
void countNodes();
void search();
void sort();

struct linked_list
{  
    int data;  
    struct linked_list *next;  
};  
typedef struct linked_list node;  
node *head=NULL,*temp=NULL; //pointers to node data type, initially NULL  

void main ()  
{  
    int choice;  
    while(1)
    {
        printf("\n                MENU                             \n");
        printf("1. Create \n");
        printf("2. Display \n");
        printf("3. Insert at beginning\n");
        printf("4. Insert at end\n");
        printf("5. Insert at middle\n");
        printf("6. Delete from beginning\n");
        printf("7. Delete from end\n");
        printf("8. Delete from middle\n");
        printf("9. Delete list\n");
        printf("10. Count number of nodes\n");
        printf("11. Search for an element\n");
        printf("12. Sort the list\n");
        printf("13. Exit\n");
        printf("\n--------------------------------------\n");
        printf("Enter your choice:");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                    create();
                    break;
            case 2:
                    display();
                    break;
            case 3:
                    insert_at_begin();
                    break;
            case 4:
                    insert_at_end();
                    break; 
            case 5:
                    insert_at_middle();
                    break;  
            case 6:
                    delete_from_begin();
                    break;        
            case 7:
                    delete_from_end();
                    break; 
            case 8:
                    delete_from_middle();
                    break; 
            case 9:
                    delete_list();
                    break;  
            case 10:
                    countNodes();
                    break;   
            case 11:
                    search();
                    break;   
            case 12:
                    sort();
                    break;   
            case 13:
                    exit(0);
                    break;
            default:
                    printf("\nWrong Choice:\n");
                    break;
        }
    }
}

void create()  
{  
    node *ptr;
    int item;
    ptr = (node *)malloc(sizeof(node));  
    if(ptr == NULL)  
    {  
        printf("\nOVERFLOW: Unable to allocate memory.\n");  
        exit(0);
    }  
    printf("\nEnter data value:\n");
    scanf("%d",&item);
    ptr->data = item;  
    ptr->next = NULL;
    if(head==NULL)
    {
        head=ptr; //Creation of 1st node 
        temp=head;
    }
    else
    { 
        temp->next=ptr; //Link previous node with new node
        temp=temp->next;
    }  
    printf("\nNode inserted\n");  
}

void display()  
{  
    node *ptr;     
    if(head == NULL)  
    {  
        printf("\nList is empty.\n"); 
        return;
    }
    else  
    { 
        ptr = head; 
        printf("\nPrinting List . . . . .\n");
        if(ptr->next==NULL)  //if the list contains only 1 node
        {
            printf("%d",ptr->data); 
            return;
        }
        while (ptr!=NULL)  
        {  
            printf("%d-->",ptr->data); 
            if(ptr->next->next==NULL)
            {
                printf("%d",ptr->next->data);
                return;
            }
            ptr = ptr -> next;  //Move to next node
        }  
    }  
} 

void insert_at_begin()  
{  
    node *ptr;  
    int item;  
    ptr = (node *) malloc(sizeof(node));  
    if(ptr == NULL)  
        printf("\nOVERFLOW: Unable to allocate memory.");  
    else  
    {  
        printf("\nEnter value\n");    
        scanf("%d",&item);    
        ptr->data = item;  
        if(head==NULL)
        {
            ptr->next=NULL;
            head=ptr;
            temp=head;
        }
        else
        {
            ptr->next = head;  
            head = ptr; 
        }    
        printf("\nNode inserted successfully");  
    }  
}
  
void insert_at_end()  
{  
    node *ptr, *temp1; 
    int item;     
    ptr = (node *)malloc(sizeof(node));      
    if(ptr == NULL)  
        printf("\nOVERFLOW: Unable to allocate memory.");     
    else  
    {  
        printf("\nEnter value\n");  
        scanf("%d",&item);  
        ptr->data = item;  
        ptr -> next = NULL;
        if(head == NULL)  
        {  
            head = ptr;  
            temp=head;
        }  
        else  
        {  
            temp1=head;
            while (temp1 -> next != NULL)  
                temp1 = temp1 -> next;  
            temp1->next = ptr;  
            ptr->next = NULL; 
            temp=ptr;
        }  
        printf("\nNode inserted successfully");
    }  
} 
 
void insert_at_middle()  
{  
    int i,loc,item;   
    node *ptr, *temp1;  
    ptr = (node *)malloc(sizeof(node));  
    if(ptr == NULL)  
        printf("\nOVERFLOW: Unable to allocate memory.");  
    else  
    {  
        printf("\nEnter element value");  
        scanf("%d",&item);  
        ptr->data = item;  
        printf("\nEnter the location:");  
        scanf("%d",&loc);  
        temp1=head;  
        for(i=2;i<=loc-1 && temp1!=NULL;i++)  
        {  
            temp1 = temp1->next;  
            if(temp1 == NULL)  
                break;
        }  
        if(temp1!=NULL)
        {
            ptr->next = temp1->next;
            temp1->next = ptr;  
            printf("\nNode inserted successfully");
        }
        else
            printf("UNABLE TO INSERT DATA AT THE GIVEN POSITION\n");
    }  
}

void delete_from_begin()
{
    node *ptr;  
    if(head == NULL)  
        printf("\nList is already empty.\n");  
    else   
    {  
        ptr = head;  
        head = ptr->next;  
        free(ptr);  
        printf("\nSUCCESSFULLY DELETED FIRST NODE FROM LIST\n");  
    }  
}

void delete_from_end()
{
    node *toDelete,*secondLastNode;  
    if(head == NULL)  
        printf("\nList is already empty.");  
    else
    {  
        toDelete = head;
        secondLastNode = head;
        while(toDelete->next != NULL)
        {
            secondLastNode = toDelete;
            toDelete = toDelete->next;
        }
        if(toDelete == head)
        {
            head = NULL;
            temp=head;
        }
        else
        {
            /* Disconnect link of second last node with last node */
            secondLastNode->next = NULL;
            temp=secondLastNode;
        }
        free(toDelete);
        printf("SUCCESSFULLY DELETED LAST NODE OF LIST\n");
    }
}

void delete_from_middle()
{  
    node *toDelete,*prevNode;  
    int loc,i; 
    if(head == NULL)  
        printf("\nList is already empty.");  
    else
    {
        printf("\nEnter the location:\n");  
        scanf("%d",&loc); 
        toDelete=head;
        prevNode=head;
        for(i=2;i<=loc;i++)
        {
            prevNode=toDelete;
            toDelete=toDelete->next;
            if(toDelete==NULL)
                break;
        }
        if(toDelete!=NULL)
        {
            if(toDelete==head)
                head=head->next;
            else
                prevNode->next=toDelete->next;  
            toDelete->next=NULL;
            free(toDelete);
            printf("NODE DELETED SUCCESSFULLY FROM THE GIVEN LOCATION\n");
        }
        else
            printf("Invalid position: Unable to delete.\n");
    }
}
    
void delete_list()
{
    node *ptr;
    while(head != NULL)
    {
        ptr = head;
        head = head->next;
        free(ptr);
    }
    printf("SUCCESSFULLY DELETED ALL NODES OF LINKED LIST\n");
}

void countNodes()
{
    int count = 0;
    node *ptr;
    ptr = head;
    while(ptr != NULL)
    {
        count++;
        ptr = ptr->next;
    }
    printf("\nTotal number of nodes = %d\n",count);
}

void search()
{
    node *ptr;  
    int key;  
    ptr = head;   
    printf("\nEnter item to be searched\n");   
    scanf("%d",&key);  
    while (ptr!=NULL && ptr->data!=key)  
        ptr = ptr -> next;  
    if(ptr!=NULL)
        printf("Item is present in the list");
    else
        printf("Item is absent in the list");
}

void sort()
{
    //current will point to head  
    node *current = head, *index = NULL;  
    int temp;  
    if(head == NULL)  
        printf("List is empty");      
    else
    {  
        while(current != NULL) 
        {  
            //index will point to next node of current  
            index = current->next;  
            while(index != NULL)
            {  
                //If current node's data is greater than index's node data, swap the data between them  
                if(current->data > index->data) 
                {  
                    temp = current->data;  
                    current->data = index->data;  
                    index->data = temp;  
                }  
                index = index->next;  
            }  
            current = current->next;  
        } 
        printf("List is sorted");
    }  
}
Editor is loading...
Leave a Comment