#include<stdio.h>
        #include<conio.h>
        #include<stdlib.h>
        #define MAX 10


        //LINKED LIST
        struct node{
            int data;
            struct node *next;
        };
        struct node *head=NULL;

        int insertbegin(int value){
            struct node *newnode;
            newnode=(struct node*)malloc(sizeof(struct node));
            newnode->data=value;
            if(head==NULL){
                newnode->next=NULL;
                head=newnode;
            }
            else{
                newnode->next=head;
                head=newnode;
            }
            printf("\nInsertion successful\n");
        }
        int insertend(int value){
            struct node *newnode;
            newnode=(struct node*)malloc(sizeof(struct node));
            newnode->data=value;
            newnode->next=NULL;
            if(head==NULL){
                head=newnode;
            }
            else{
                struct node *temp=head;
                while(temp->next!=NULL){
                    temp=temp->next;
                }
                temp->next=newnode;
            }
            printf("\nInsertion successful\n");
        }
        int insertspecific(int value){
            int pos;
            struct node *newnode;
            newnode=(struct node*)malloc(sizeof(struct node));
            newnode->data=value;
            if(head==NULL){
                newnode->next=NULL;
                head=newnode;
            }
            else{
                printf("enter the position : ");
                scanf("%d",&pos);
                struct  node *temp=head,*temp2;
                int i=1;
                    for(i=1;i<pos;i++){
                        temp2=temp;
                        temp=temp->next;
                    }
                    temp2->next=newnode;
                    newnode->next=temp;
            }
            printf("\nInsertion successful\n");
        }

        int deletebegin(){
            struct node *temp=head;
            if(head==NULL){
                printf("\n list empty(underflow)\n");
            }
            else{
                head=temp->next;
                free(temp);
                printf("deletion successful\n");
            }
        }
        int deleteend(){
            if(head==NULL){
                printf("\nlist empty(underflow)\n");
            }
            else{
                struct node *temp=head,*temp2;
                while(temp->next!=NULL){
                    temp2=temp;
                    temp=temp->next;
                }
                free(temp);
                temp2->next=NULL;
                printf("\nDeletion successful\n");	
            }
        }
        int deletespecific(){
            int pos;
                printf("enter the position :: ");
                scanf("%d",&pos);
                struct node *temp=head,*temp2;
            if(pos==1){
                head=temp->next;
                free(temp);
            }
            else{
                int i;
                for(i=1;i<=pos-1;i++){
                    temp2=temp;
                    temp=temp->next;
                }
                temp2->next=temp->next;
                free(temp);
                printf("\ndeletion successful\n");
            }
        }

        int display(){
            struct node *temp=head;
            if(head==NULL){
                printf("\nlist empty(underflow)\n");
            }
            else{
            printf("\nlist : ");
            while(temp!=NULL){
                printf("%d ",temp->data);
                temp=temp->next;
                }
            }
            printf("\n------------------------------------------------------------\n");
        }

        //STACK
        int stack[MAX],top=-1;
        int push(){
            if(top==MAX-1){
                printf("Overflow\n");
            }
            else{
                int value;
            printf("\nenter the value :: ");
            scanf("%d",&value);
            top++;
                stack[top]=value;
                printf("\nValue pushed successfully\n");
            }
        }
        int pop(){
            if(top==-1){
                printf("Underflow\n");
            }
            else{
                printf("value poped from stack :: | %d |",stack[top]);
                top--;
            }
        }
        int displaystack(){
            int i;
            if(top==-1){
                printf("\nstack empty(underflow)\n");
            }
            else{
            printf("\nstack = ");
            for(i=top;i>=0;i--){
                printf("\n| %d |",stack[i]);
                }
            }
        }

        //QUEUE
        int queue[MAX],front=-1,rear=-1;
        int enqueue(){
                if(rear==MAX-1){
                printf("overflow\n");
            }
            else{
                int value;
            printf("\nenter the value : ");
            scanf("%d",&value);
            if(front==-1 || rear==-1){
                front=0;
                rear=0;
                queue[rear]=value;
                }
            else{
                rear++;
                queue[rear]=value;	
            }
            printf("enqueued successful\n");
            }
        }

        int dequeue(){
            if(rear==-1 ||rear < front){
                printf("\nqueue underflow");
            }
            else{
            if(front==rear){
            printf("\ndequeued = %d ",queue[front]);
            front=rear=-1;
            }
            else{
            printf("\ndequeued = %d ",queue[front]);
            front++;
            }
            printf("\ndequeued successfull\n");
            }	
        }
        int displayqueue(){
            int i;
            if(front==-1){
                printf("\nunderflow\n");
            }
            else{
            printf("\n queue = | ");
            for(i=front;i<=rear;i++){
                printf("%d ",queue[i]);
            }
            printf("|");
            }
        }

        //main function
        int main(){
            dss:
            printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
            int ds;
            printf("\nselect DATA STRUCTURE\n");
            printf("======================================\n");
            printf("(1)linked list \n(2)stack \n(3)queue \n(0)Exit\n");
            printf("\nEnter DS : ");
            scanf("%d",&ds);
            printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n");
            
            //DS
            switch(ds){
                //LINKED LIST
                case 1:
            printf("\n\t\t------------------------------\n");
            printf("\t\t|         LINKED LIST        |");
            printf("\n\t\t------------------------------\n");
                
            int value,i,op;
            shikha:
                printf("\n\n------------------------------------------------------------\n");
                printf("\nINSERT = 1.begin 2.end 3.specific  \nDELETE = 5.begin 6.end 7.specific  \n\n4.display 0.exit 99.change data structure\n\nenter operation :: ");
                scanf("%d",&op);
                    printf("\n\n------------------------------------------------------------\n");
                switch(op){
                    case 1:
                            printf("enter the value : ");
                            scanf("%d",&value);
                            insertbegin(value);
                            break;
                    case 2:
                            printf("enter the value : ");
                            scanf("%d",&value);
                            insertend(value);
                            break;
                    case 3:
                            printf("enter the value : ");
                            scanf("%d",&value);
                            insertspecific(value);
                            break;
                    case 5:
                            deletebegin();
                            break;
                    case 6:
                            deleteend();
                            break;
                    case 7:
                            deletespecific();
                            break;
                    case 4:
                            display();
                            getch();
                            break;
                    case 0:
                            exit(0);
                    case 99:
                        goto dss;	
                default:
                    printf("Invalid operation");
                }
                goto shikha;
                break;
                
                //STACK
            case 2:
                printf("\n\t\t-----------------------\n");
            printf("\t\t|         STACK       |");
            printf("\n\t\t-----------------------\n");
                    int opp;
            tanmay:
                    printf("\n\n------------------------------------------------------------\n");
                printf("\n1.PUSH 2.POP \n\n3.displaystack 0.exit 99.change data structure\n\nenter operation :: ");
                scanf("%d",&opp);
                    printf("\n\n------------------------------------------------------------\n");
                switch(opp){
                    case 1:
                        push();
                        displaystack();
                        break;
                    case 2:
                        pop();
                        displaystack();
                        break;
                    case 3:
                        displaystack();
                        getch();
                        break;
                    case 99:
                        goto dss;	
                        
                    case 0:
                        exit(0);
                    default:
                    printf("Invalid operation");
                }	
                goto tanmay;
                break;
                
                //queue
            case 3:
                printf("\n\t\t-----------------------\n");
            printf("\t\t|         QUEUE       |");
            printf("\n\t\t-----------------------\n");
                    int opr;
            shiktan:
                    printf("\n\n------------------------------------------------------------\n");
                printf("\n1.Enqueue 2.Dequeue \n\n3.displayqueue 0.exit 99.change data structure\n\nenter operation :: ");
                scanf("%d",&opr);
                    printf("\n\n------------------------------------------------------------\n");
                switch(opr){
                    case 1:
                        enqueue();
                        displayqueue();
                        break;
                    case 2:
                        dequeue();
                        displayqueue();
                        break;
                    case 3:
                        displayqueue();
                        getch();
                        break;
                    case 99:
                        goto dss;	
                        
                    case 0:
                        exit(0);
                    default:
                    printf("Invalid operation");
                }	
                goto shiktan;
                break;
                
                //exit
                case 0:
                    exit(0);
                default:
                    printf("Invalid operation");
                }
                getch();
                goto dss;
            }