programs of DS for performing different operations on SINGLY LINK LIST

Home >> Sem 2 >>SINGLY LINK LIST

//download from http://gtu-mca.blogspot.com
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>

struct list1
{
        int info1;
        struct list1 *nxt1;
}* head1=NULL,*node1;

struct list2
{
        int info2;
        struct list2 *nxt2;
}* head2=NULL,*node2;

void push();
void pop();
void display();
void concate();
void marge();
void insert();
void sort();
void list_union();
void list_intersection();
void list_sum();
void list_count();
void list_rev();

void main()
{
        int i=0;
        clrscr();
        do
        {       clrscr();
                printf("\n=================MENU===============\n\n");
                printf(" 1.) INSERT ELEMENT..................\n");
                printf(" 2.) DELETE ELEMENT..................\n");
                printf(" 3.) DISPLAY ELEMENT.................\n");
                printf(" 4.) INSERT AT PARTICULAR POSITION...\n");
                printf(" 5.) CONCATINATE TWO LISTS...........\n");
                printf(" 6.) MARGE TWO LISTS.................\n");
                printf(" 7.) SORT TWO LISTS..................\n");
                printf(" 8.) UNION OF TWO LISTS..............\n");
                printf(" 9.) INTERSECTION OF TWO LISTS.......\n");
                printf("10.) SUM OF TWO LIST.................\n");
                printf("11.) COUNT THE ELEMENTS OF THE LIST..\n");
                printf("12.) REVERSR BOTH OF THE LISTS.......\n");
                printf("13.) EXIT............................\n");
                printf("\nENTER YOUR CHOICE..................");
                scanf("%d",&i);
                switch(i)
                {
                        case 1:        push();        break;
                        case 2:        pop();  break;
                        case 3:        display();  break;
                        case 4:        insert();  break;
                        case 5:        concate();  break;
                        case 6:        marge();  break;
                        case 7:        sort();  break;
                        case 8:        list_union();  break;
                        case 9:        list_intersection();  break;
                        case 10:list_sum(); break;
                        case 11:list_count(); break;
                        case 12:list_rev(); break;
                        case 13:exit(1);
                        default :
                        printf("\n\nENTER NUMBER BETWEEN 1 TO 10 ONLY..");
                        getch();
                }
        }while(1);
}
void push()
{
        int ch;
        printf("\n\nIN WHICH LIST YOU WANT TO INSERT....?");
        printf("\n\nLIST - 1  OR  LIST - 2..............? ");
        scanf("%d",&ch);
        if(ch==1)
        {
                struct list1 *templ1;
                templ1 = (struct list1 *) (malloc(sizeof(struct list1)));
                printf("\n\nENTER ELEMENT FOR LIST - 1 : ");
                scanf("%d",&templ1->info1);
                templ1->nxt1 = NULL;
                if(head1==NULL)
                {        head1 = templ1;
                        node1 = head1;        }
                else
                {        node1->nxt1 = templ1;
                        node1 = templ1;        }
  //                free(templ1);
        }
        else if(ch==2)
        {
                struct list2 *templ2;
                templ2 = (struct list2 *)(malloc(sizeof(struct list2)));
                printf("\n\nENTER ELEMENT FOR LIST - 2 : ");
                scanf("%d",&templ2->info2);
                templ2->nxt2 = NULL;
                if(head2==NULL)
                {        head2 = templ2;
                        node2 = head2;                }
                else
                {        node2->nxt2 = templ2;
                        node2 = templ2;                }
//                free(templ2);
        }
        else
        {        clrscr();
                printf("\n\nENTER ONLY 1 OR 2.....");
                getch();        }
}
void pop()
{
        struct list1 *deltemp1,*delfind1,*delprev1;
        struct list2 *deltemp2,*delfind2,*delprev2;
        int ch,pos;
        printf("\n\nENTER FROM WHICH LIST YOU WANT TO DELETE....");
        printf("\n\nLIST - 1 OR LIST - 2...: ");
        scanf("%d",&ch);
        if(ch<1||ch>2)
        {        clrscr();
                printf("\n\nENTER ONLY 1 OR 2.....");
                getch();        return;        }
        display();
        printf("\n\nENTER IN WHICH ELEMENT YOU WANT TO DELETE....");
        scanf("%d",&pos);
        if(ch==1)
        {
                delfind1 = head1;
                if(delfind1==NULL)
                {        printf("\n\nLIST - 1 IS EMPTY....");
                        getch();        }
                else if(delfind1->info1==pos)
                        head1 = delfind1->nxt1;
                else
                {       delprev1 = head1;
                        delfind1 = delfind1->nxt1;
                        while(delfind1->nxt1!=NULL)
                        {        if(delfind1->info1==pos)
                                {        delprev1->nxt1 = delfind1->nxt1;
                                        break;        }
                                else
                                {        delfind1 = delfind1->nxt1;
                                        delprev1 = delprev1->nxt1;        }
                        }
                        if(delfind1->info1==pos && delfind1->nxt1==NULL)
                        {        node1 = delprev1;
                                delprev1->nxt1 = NULL;        }
                }
        }
        else
        {
                delfind2 = delprev2 = head2;
                if(delfind2==NULL)
                {        printf("\n\nLIST - 2 IS EMPTY....");
                        getch();        }
                else if(delfind2->info2==pos)
                        head2 = delfind2->nxt2;
                else
                {       delprev2 = head2;
                        delfind2 = delfind2->nxt2;
                        while(delfind2->nxt2!=NULL)
                        {        if(delfind2->info2==pos)
                                {        delprev2->nxt2 = delfind2->nxt2;
                                        break;        }
                                else
                                {        delfind2 = delfind2->nxt2;
                                        delprev2 = delprev2->nxt2;        }
                        }
                        if(delfind2->info2==pos && delfind2->nxt2==NULL)
                        {        node2 = delprev2;
                                delprev2->nxt2 = NULL;        }
                }
        }
}
void display()
{
        struct list1 *temp1;
        struct list2 *temp2;
        printf("\n\nELEMENTS OF LIST-1==");
        temp1 = head1;
        if(temp1==NULL)
                printf(" LIST-1 IS EMPTY....");
        else
                while(temp1!=NULL)
                {        printf("%4d,",temp1->info1);
                        temp1 = temp1->nxt1;                }
        printf("\n\nELEMENTS OF LIST-2==");
        temp2 = head2;
        if(temp2==NULL)
                printf(" LIST-2 IS EMPTY....");
        else
                while(temp2!=NULL)
                {        printf("%4d,",temp2->info2);
                        temp2 = temp2->nxt2;                }
        getch();
}
void insert()
{
        int ch,pos;
        printf("\n\nENTER IN WHICH LIST YOU WANT TO INSERT....");
        printf("\n\nLIST - 1 OR LIST - 2...: ");
        scanf("%d",&ch);
        if(ch<1||ch>2)
        {        clrscr();
                printf("\n\nENTER ONLY 1 OR 2.....");
                getch();        return;        }
        display();
        if(ch==1)
        {
                struct list1 *templ1,*findpos1;
                templ1 = (struct list1 *) (malloc(sizeof(struct list1)));
                findpos1 = head1;
                if(findpos1==NULL)
                {        printf("\n\nLIST - 1 IS EMPTY.....");
                        getch();        }
                else
                {              printf("\n\nAFTER WHICH ELEMENT YOU WANT TO INSERT..: ");
                        scanf("%d",&pos);
                        while(findpos1->info1!=pos&&findpos1!=NULL)
                                findpos1 = findpos1->nxt1;
                        if(findpos1->info1==pos)
                        {        printf("\n\nENTER ELEMENT FOR LIST - 1 : ");
                                scanf("%d",&templ1->info1);
                                templ1->nxt1 = findpos1->nxt1;
                                findpos1->nxt1 = templ1;
                        }
                        else
                        {        printf("\n\nELEMENT NOT FOUND...");
                                getch();        }
                }
        }
        else
        {
                struct list2 *templ2,*findpos2;
                templ2 = (struct list2 *)(malloc(sizeof(struct list2)));
                findpos2 = head2;
                if(findpos2==NULL)
                {        printf("\n\nLIST - 2 IS EMPTY.....");
                        getch();        }
                else
                {       printf("\n\nAFTER WHICH ELEMENT YOU WANT TO INSERT..: ");
                        scanf("%d",&pos);
                        while(findpos2->info2!=pos)
                                findpos2 = findpos2->nxt2;
                        if(findpos2->info2==pos&&findpos2->info2!=NULL)
                        {        printf("\n\nENTER ELEMENT FOR LIST - 2 : ");
                                scanf("%d",&templ2->info2);
                                templ2->nxt2 = findpos2->nxt2;
                                findpos2->nxt2 = templ2;
                        }
                        else
                        {        printf("\n\nELEMENT NOT FOUND...");
                                getch();        }
                }
        }
}
void concate()
{
        struct list1 *temphead1;
        struct list2 *temphead2;
        temphead1 = head1;
        temphead2 = head2;
        if(temphead1==NULL&&temphead2==NULL)
        {        printf("\n\nBOTH LISTS ARE EMPTY....");
                return;        }
        display();
        printf("\n\n=====THE CONCATINATION OF LIST-1 and LIST-2 IS =====\n\n");
        if(temphead1==NULL)
                while(temphead2!=NULL)
                {        printf("%4d,",temphead2->info2);
                        temphead2 = temphead2->nxt2;        }
        else if(temphead2==NULL)
                while(temphead1!=NULL)
                {        printf("%4d,",temphead1->info1);
                        temphead1 = temphead1->nxt1;        }
        else
        {        while(temphead1!=NULL)
                {        printf("%4d,",temphead1->info1);
                        temphead1 = temphead1->nxt1;        }
                while(temphead2!=NULL)
                {        printf("%4d,",temphead2->info2);
                        temphead2 = temphead2->nxt2;        }
        }getch();
}
void marge()
{        struct list1 *temphead1;
        struct list2 *temphead2;int comp;
        temphead1 = head1;
        temphead2 = head2;
        sort();
        if(temphead1==NULL && temphead2==NULL)
        {        printf("\n\nBoth the Lists are EMPTY...");
                return;                }
        printf("\n\n====MARGE of two lists List-1 and List-2====\n\n");
        if(temphead1==NULL)
        {        while(temphead1!=NULL)
                {       printf("%4d ,",temphead1->info1);
                        temphead1 = temphead1->nxt1;                }
        }
        else if(temphead2==NULL)
        {        while(temphead2!=NULL)
                {       printf("%4d ,",temphead2->info2);
                        temphead2 = temphead2->nxt2;                }
        }
        else
        {        while(temphead1!=NULL)
                {        comp = temphead1->info1;
                        if(temphead2!=NULL)
                        {
                                while(temphead2!=NULL)
                                {        if(temphead2->info2 <= comp)
                                        {        printf("%4d ,",temphead2->info2);
                                                temphead2 = temphead2->nxt2;        }
                                        else if(comp < temphead2->info2)
                                        {        printf("%4d ,",comp);
                                                temphead1 = temphead1->nxt1;
                                                break;        }
                                }
                        }
                        else
                        {        printf("%4d ,",comp);
                                temphead1 = temphead1->nxt1;        }
                }
                if(temphead2!=NULL)
                {        while(temphead2!=NULL)
                        {        printf("%4d ,",temphead2->info2);
                                temphead2 = temphead2->nxt2;
                        }
                }
                if(temphead1!=NULL)
                {        while(temphead1!=NULL)
                        {        printf("%4d ,",temphead1->info1);
                                temphead1 = temphead1->nxt1;
                        }
                }
        }getch();
}
void sort()
{
        int count=0,tempswap;
        struct list1 *i1,*j1,*sorttemp1;
        sorttemp1 = head1;
        if(sorttemp1==NULL)
                printf("\n\nLIST-1 IS EMPTY.....");
        else if(sorttemp1->nxt1==NULL)
                printf("\n\nONLY ONE ELEMENT IS THERE IN LIST-1..");
        else
        {       i1 = sorttemp1; j1 = i1->nxt1;
                do
                {       do
                        {        if(i1->info1 > j1->info1)
                                {        tempswap =  i1->info1;
                                        i1->info1 = j1->info1;
                                        j1->info1 = tempswap;        }
                                j1 = j1->nxt1;
                        }while(j1->info1!=NULL);
                        if(count==0)        head1 = i1;
                        count++; i1 = i1->nxt1; j1 = i1->nxt1;
                }while((i1->nxt1)!=NULL);
        }count=0;
        //=================================================
        struct list2 *i2,*j2,*sorttemp2;
        sorttemp2 = head2;
        if(sorttemp2==NULL)
                printf("\n\nLIST-2 IS EMPTY.....");
        else if(sorttemp2->nxt2==NULL)
                printf("\n\nONLY ONE ELEMENT IS THERE IN LIST-2..");
        else
        {       i2 = sorttemp2; j2 = i2->nxt2;
                do
                {       do
                        {        if(i2->info2 > j2->info2)
                                {        tempswap =  i2->info2;
                                        i2->info2 = j2->info2;
                                        j2->info2 = tempswap;        }
                                j2 = j2->nxt2;
                        }while(j2->info2!=NULL);
                        if(count==0)        head2 = i2;
                        count++; i2 = i2->nxt2; j2 = i2->nxt2;
                }while((i2->nxt2)!=NULL);
        }
        printf("\n\n=========SORTED LISTS==========\n");
        display();
}
void list_union()
{       int flag=0;
        struct list1 *temphead1;
        struct list2 *temphead2;
        temphead1 = head1;
        temphead2 = head2;
        if(temphead1==NULL&&temphead2==NULL)
        {        printf("\n\nBOTH LISTS ARE EMPTY....");
                return;        }
        display();
        printf("\n\n=====THE UNION OF LIST-1 and LIST-2 IS =====\n\n");
        if(temphead1==NULL)
                while(temphead2!=NULL)
                {        printf("%4d,",temphead2->info2);
                        temphead2 = temphead2->nxt2;        }
        else if(temphead2==NULL)
                while(temphead1!=NULL)
                {        printf("%4d,",temphead1->info1);
                        temphead1 = temphead1->nxt1;        }
        else
        {        while(temphead1!=NULL)
                {        printf("%4d,",temphead1->info1);
                        temphead1 = temphead1->nxt1;        }
                while(temphead2!=NULL)
                {        temphead1 = head1;flag=0;
                        while(temphead1!=NULL)
                                if(temphead1->info1==temphead2->info2)
                                {        flag=1;        break;        }
                                else        temphead1=temphead1->nxt1;
                        if(flag==0)
                        printf("%4d,",temphead2->info2);
                        temphead2 = temphead2->nxt2;
                }
        }getch();
}
void list_intersection()
{
        struct list1 *temphead1;
        struct list2 *temphead2;
        temphead1 = head1;
        display();
        printf("\n\n======INTERSECTION OF LIST-1 and LIST-2 IS========\n\n");
        int intcount=0;
        while(temphead1!=NULL)
        {        temphead2 = head2;
                while(temphead2!=NULL)
                {       if(temphead1->info1 == temphead2->info2)
                        {        printf("%4d,",temphead1->info1);
                                intcount++;        break;        }
                        temphead2 = temphead2->nxt2;
                }
                temphead1 = temphead1->nxt1;
        }
        if(intcount==0)        printf("\n\nNO ANY COMMON ELEMENTS ARE THERE IN LIST-1 and LIST-2..\n\n");
        getch();
}
void list_sum()
{
        struct list1 *temphead1;
        struct list2 *temphead2;
        int suml1=0,suml2=0;
        temphead1 = head1;
        temphead2 = head2;
        display();
        printf("\n\n========SUM OF THE TWO LIST========\n\n");
        if(temphead1==NULL)
                printf("List-1 is EMPTY.....\n");
        else
        {        while(temphead1!=NULL)
                {        suml1+=temphead1->info1;
                        temphead1=temphead1->nxt1;        }
                printf("SUM OF THE ELEMENTS OF LIST-1 IS : %d",suml1);
        }
        if(temphead2==NULL)
                printf("List-2 is EMPTY.....\n");
        else
        {        while(temphead2!=NULL)
                {        suml2+=temphead2->info2;
                        temphead2=temphead2->nxt2;        }
                printf("\n\nSUM OF THE ELEMENTS OF LIST-2 IS : %d",suml2);
        }
        getch();
}
void list_count()
{
        struct list1 *temphead1;
        struct list2 *temphead2;
        int countl1=0,countl2=0;
        temphead1 = head1;
        temphead2 = head2;
        display();
        printf("\n\n========COUNT OF THE TWO LIST========\n\n");
        if(temphead1==NULL)
                printf("List-1 is EMPTY.....\n");
        else
        {        while(temphead1!=NULL)
                {        countl1++;
                        temphead1=temphead1->nxt1;        }
                printf("TOTAL NUMBER OF ELEMENTS IN LIST-1 IS : %d",countl1);
        }
        if(temphead2==NULL)
                printf("List-2 is EMPTY.....\n");
        else
        {        while(temphead2!=NULL)
                {        countl2++;
                        temphead2=temphead2->nxt2;        }
                printf("\n\nTOTAL NUMBER OF ELEMENTS IN LIST-2 IS : %d",countl2);
        }
        getch();
}
void list_rev()
{
        struct list1 *temphead1=head1;
        struct list1 *mid1,*tmid1;
        struct list2 *temphead2=head2;
        struct list2 *mid2,*tmid2;
        int cnt1=0,cnt2=0;
        int i,j,st1,st2;
        while(temphead1!=NULL)
        {        cnt1++;
                temphead1=temphead1->nxt1;        }
        while(temphead2!=NULL)
        {        cnt2++;
                temphead2=temphead2->nxt2;        }
        temphead1 = head1; temphead2 = head2;
        for(i=1;i<=(cnt1/2);i++)
                temphead1 = temphead1->nxt1;
        for(i=1;i<=(cnt2/2);i++)
                temphead2 = temphead2->nxt2;
        mid1 = temphead1;
        mid2 = temphead2;
        temphead1 = head1; temphead2 = head2;

        if(cnt1>1&&cnt1%2==0)
        {       int tcnt1 = cnt1;
                for(i=1;i<=(cnt1/2);i++)
                {       tmid1 = mid1;
                        for(j=((cnt1/2)+1);j<tcnt1;j++)
                                tmid1 = tmid1->nxt1;
                        tcnt1--;
                        st1 = temphead1->info1;
                        temphead1->info1 = tmid1->info1;
                        tmid1->info1 = st1;
                        temphead1 = temphead1->nxt1;
                }
        }
        if(cnt2>1&&cnt2%2==0)
        {       int tcnt2 = cnt2;
                for(i=1;i<=(cnt2/2);i++)
                {       tmid2 = mid2;
                        for(j=((cnt2/2)+1);j<tcnt2;j++)
                                tmid2 = tmid2->nxt2;
                        tcnt2--;
                        st2 = temphead2->info2;
                        temphead2->info2 = tmid2->info2;
                        tmid2->info2 = st2;
                        temphead2 = temphead2->nxt2;
                }
        }
        getch();
}