用稀疏矩阵的三元组进行加法

算法思想:在进行三元组的加法时
前提条件:用while循环,它的出口条件为 i,j 都小于他们分别所对应的三元组中元素的个数。
满足前提条件的情况下,分3种情况:
1. 行列数相等;(1)相加等于零,则直接跳过,i++;j++;。(2)相加不为零,把相加后的数写下来,i++;j++;
2. A的行大于B的行;(1)写下行数小的一个,也就是B。然后进行B的j++;
3. A的行小于B的行;(1)写下行数小的一个,也就是A。然后进行A的i++;
 当 i,j 其中一个或者两个不满足前提条件时,退出循环。此时又分两种情况:
1. i>A的三元组中元素的个数并且 j<=B的三元组中的元素的个数,此时写B。写B时注意用while循环把B剩下的元素全都写下来。
2. j>B的三元组中元素的个数并且 i<=A的三元组中的元素的个数,此时写A。写A时注意用while循环把A剩下的元素全都写下来。

所以,代码如下:

#include <stdio.h>

typedef struct{
    int data[50][50];
    int r,c;
}matrix;

void creat(matrix *A)
{
    int m,n;
    printf("Please input the matric's row and col \n");
    scanf("%d",&A->r);
    scanf("%d",&A->c);
    printf("Please input the matric's array \n");
    for(m=0;m<A->r;m++)
        for(n=0;n<A->c;n++)
           scanf("%d",&A->data[m][n]);
}

void input(matrix A)
{
    int m,n;
    for(m=1;m<=A.r;m++)
        for(n=1;n<=A.c;n++)
          {
              printf("%5d",A.data[m-1][n-1]);
              if(n%A.c==0)
                 printf("\n");
          }
}

// 三元组表示
void Three(matrix B,int A[100][3])
{
    int m,n;
    int k=1;
    for(m=0;m<B.r;m++)
        for(n=0;n<B.c;n++)
            if(B.data[m][n]!=0)
        {
            A[k][0]=m;
            A[k][1]=n;
            A[k][2]=B.data[m][n];
            k++;
        }
        A[0][0]=B.r;
        A[0][1]=B.c;
        A[0][2]=k-1;
}
void display(int A[100][3])
{
    int i,j;
    for(i=0;i<=A[0][2];i++)
        for(j=0;j<3;j++)
           {
               printf("%5d",A[i][j]);
               if(j==2)
                printf("\n");
           }

}


void add(int A[100][3],int B[100][3],int C[100][3])
{
        int i=1,j=1;
        int m=1;

   while(i<=A[0][2] && j<=B[0][2])
    {
        if(A[i][0]==B[j][0] && A[i][1]==B[j][1])
           {
              if(A[i][2]+B[j][2]!=0)
                  {
                     C[m][0]=A[i][0];
                     C[m][1]=A[i][1];
                     C[m][2]=A[i][2]+B[j][2];
                     m++;
                     i++;
                     j++;
                   }
               if(A[i][2]+B[j][2]==0)
               {
                   i++;
                   j++;
               }
            }
            else
                if(A[i][0]==B[j][0] && A[i][1]<B[j][1])
            {
                C[m][0]=A[i][0];
                C[m][1]=A[i][1];
                C[m][2]=A[i][2];
                m++;
                i++;
            }
            else
                if(A[i][0]==B[j][0] && A[i][1]>B[j][1])
            {
                C[m][0]=B[j][0];
                C[m][1]=B[j][1];
                C[m][2]=B[j][2];
                m++;
                j++;
            }
            else
                if(A[i][0]>B[j][0])
            {
                C[m][0]=B[j][0];
                C[m][1]=B[j][1];
                C[m][2]=B[j][2];
                m++;
                j++;
            }
            else
                if(A[i][0]<B[j][0])
            {
                C[m][0]=A[i][0];
                C[m][1]=A[i][1];
                C[m][2]=A[i][2];
                i++;
                m++;
            }
     }
     if(i>A[0][2])
     {
         while(j<=B[0][2])
         {
             C[m][0]=B[j][0];
             C[m][1]=B[j][1];
             C[m][2]=B[j][2];
             m++;
             j++;
         }

     }
     else
        if(j>B[0][2])
     {
         while(i<=A[0][2])
         {
             C[m][0]=A[i][0];
             C[m][1]=A[i][1];
             C[m][2]=A[i][2];
             m++;
             i++;
         }

     }
         C[0][0]=A[0][0];
         C[0][1]=A[0][1];
         C[0][2]=m-1;

}
int main()
{
    int A[100][3];
    int B[100][3];
    int C[100][3];
    matrix i,j; //  创建了一个矩阵B;
    creat(&i);
    input(i);
    Three(i,A);
    printf("Display the Three \n");
    display(A);
    printf("----------------------------------\n");
    creat(&j);
    input(j);
    Three(j,B);
    printf("Display the Three \n");
    display(B);
    add(A,B,C);
    printf("----------------------------------\n");
    printf("After add display the Three \n");
    display(C);
    return 0;
}

阅读更多
上一篇朴素模式匹配
下一篇顺序表的优先遍历
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭