Friday, September 6, 2013

C program for Addition of Sparse Matrix

/*  Add Sparse Matrix...- Contributed by Tushar Anand  */


#include<stdio.h>
#include<stdlib.h>
struct sparse
{
        int *arr;
        int cnt;
};
int c=0;
void create(struct sparse *s)
{
        int arr[3][3];
        int l,i,j;
        s->cnt=0;
        printf("Enter elements\n");
        for(i=0;i<3;i++)
        {
                for(j=0;j<3;j++)
                {
                        scanf("%d",&arr[i][j]);
                        if(arr[i][j]!=0)
                        s->cnt++;
                }//for j
        }//for i
        if(s->cnt>9/2)
        {
                printf("\nNot Sparse matrix\n");
        }
        else
        {
                c=1;
                s->arr=(int *)malloc(sizeof(int)*(s->cnt+1)*3);
                *(s->arr+0)=3;
                *(s->arr+1)=3;
                *(s->arr+2)=s->cnt;
                l=3;
                for(i=0;i<3;i++)
                {
                        for(j=0;j<3;j++)
                        {
                                if(arr[i][j]!=0)
                                {
                                        *(s->arr+l+0)=i;
                                        *(s->arr+l+1)=j;
                                        *(s->arr+l+2)=arr[i][j];
                                        l=l+3;
                                }//if
                        }//for j
                }//for i
        }
}
display(struct sparse *s)
{
        int i;
        for(i=0;i<(s->cnt)*3+3;i++)
        {
                if(i%3==0&&i!=0)
                printf("\n");
                printf("%d\t",*(s->arr+i));
        }//for i
}
void add(struct sparse *s1,struct sparse *s2,struct sparse *s3)
{
        int i,j,k=3,l=3,m=3,flag=0;    
        s3->arr=(int *)malloc(sizeof(int)*(s1->cnt+s2->cnt+1)*3);
        *(s3->arr+0)=3;
        *(s3->arr+1)=3;
        for(i=0;i<3;i++)
        {
                if(*(s1->arr+m+0)==i &&*(s2->arr+l+0)==i)
                {
                        for(j=0;j<3;j++)
                        {
                                if(*(s1->arr+m+1)==j&&*(s2->arr+l+1)==j && *(s1->arr+m+0)==i &&*(s2->arr+l+0)==i)
                                {
                                        *(s3->arr+k+0)=i;
                                        *(s3->arr+k+1)=j;
                                        *(s3->arr+k+2)=*(s1->arr+m+2)+*(s2->arr+l+2);
                                        k+=3;
                                        flag++;
                                        m+=3;
                                        l+=3;
                                }
                                else if(*(s1->arr+m+1)==j && *(s1->arr+m+0)==i)
                                {
                                        *(s3->arr+k+0)=i;
                                        *(s3->arr+k+1)=j;
                                        *(s3->arr+k+2)=*(s1->arr+m+2);
                                        flag++;
                                        k+=3;
                                        m+=3;
                                }
                                else if(*(s2->arr+l+1)==j && *(s2->arr+l+0)==i)
                                {
                                        *(s3->arr+k+0)=i;
                                        *(s3->arr+k+1)=j;
                                        *(s3->arr+k+2)=*(s2->arr+l+2);
                                        flag++;
                                        k+=3;
                                        l+=3;
                                }
                        }
                }
                else if(*(s1->arr+m+0)==i)
                {
                        for(j=0;j<3;j++)
                        {
                                *(s3->arr+k+0)=i;
                                *(s3->arr+k+1)=j;
                                *(s3->arr+k+2)=*(s1->arr+m+2);
                                flag++;
                                k+=3;
                                m+=3;
                        }
                }
                else if(*(s2->arr+l+0)==i)
                {
                        for(j=0;j<3;j++)
                        {
                                *(s3->arr+k+0)=i;
                                *(s3->arr+k+1)=j;
                                *(s3->arr+k+2)=*(s2->arr+l+2);
                                flag++;
                                k+=3;
                                l+=3;
                        }
                }
        }
        *(s3->arr+2)=flag;
        s3->cnt=flag;
}
void main()
{
        struct sparse head,head1,head2;
        create(&head);
        create(&head1);
        if(c==1)
        {
        display(&head);
        display(&head1);
        add(&head,&head1,&head2);
        printf("\n\nAdded matrix :: \n\n");
        display(&head2);
        }
}