#include<stdio.h>
#include<stdlib.h>
#define Max 100
typedef struct
{
    int line;//行
    int column;//列
    int number;//非零数
}Node;
typedef struct
{
    int Arrline;//行
    int Arrclou;//列
    int ArrNZ;//非零元素个数
    Node data[Max];
}SPA;
void Input(SPA *Head);
void Enqueue(SPA *TC,int *tc,SPA *TB,int *tb);
void AddTogether(SPA *A,SPA *B,SPA *C);
void Print(SPA *C);
void main()
{
    SPA *A,*B,*C;
    A=(SPA *)malloc(sizeof(SPA));
    B=(SPA *)malloc(sizeof(SPA));
    C=(SPA *)malloc(sizeof(SPA));
    printf("    第一个稀疏矩阵:\n");
    Input(A);
    printf("    第二个稀疏矩阵:\n");
    Input(B);
    AddTogether(A,B,C);
    Print(C);
}
void Input(SPA *Head)
{
    int i,j;
    printf("输入稀疏矩阵的行数:");
    scanf("%d",&Head->Arrline);
    printf("输入稀疏矩阵的列数:");
    scanf("%d",&Head->Arrclou);
    printf("输入非零元素的个数:");
    scanf("%d",&Head->ArrNZ);
    for(i=0;i<Head->ArrNZ;i++)
    {
        printf("输入第 %d 个非零元素的行号:",i+1);
        scanf("%d",&Head->data[i].line); 
        printf("输入第 %d 个非零元素的列号:",i+1);
        scanf("%d",&Head->data[i].column);
        printf("输入第 %d 个非零元素的数值:",i+1);
        scanf("%d",&Head->data[i].number);
    }
}
void Enqueue(SPA *TC,int *tc,SPA *TB,int *tb)
{
    TC->data[*tc].line  =TB->data[*tb].line; 
    TC->data[*tc].column=TB->data[*tb].column;
    TC->data[*tc].number=TB->data[*tb].number;
    *tc=*tc+1;      *tb=*tb+1;
}
void AddTogether(SPA *A,SPA *B,SPA *C)
printf怎么加两个条件{
    int i=0,j=0,k=0;
    for(i=0;i<Max;i++)
        C->data[i].number=0;
    C->Arrline=A->Arrline;
    C->Arrclou=A->Arrclou;
    C->ArrNZ=A->ArrNZ+B->ArrNZ;
    i=0;  j=0;  k=0;
    while((i<A->ArrNZ) && (j<B->ArrNZ) ) 
    { 
        if(A->data[i].line < B->data[j].line)//出最小 行号
            Enqueue(C,&k,A,&i);
        if(A->data[i].line == B->data[j].line)
        {
            if(A->data[i].column > B->data[j].column)
                Enqueue(C,&k,B,&j);
            if(A->data[i].column < B->data[j].column)
                Enqueue(C,&k,A,&i);
            if(A->data[i].column == B->data[j].column)
            {
                Enqueue(C,&k,A,&i);
                C->data[k-1].number+=B->data[j++].number;
            }
        }
        if(A->data[i].line > B->data[j].line)
            Enqueue(C,&k,B,&j);
    } 
    while(i < A->ArrNZ) 
        Enqueue(C,&k,A,&i);
    while(j < B->ArrNZ) 
        Enqueue(C,&k,B,&j);
    for(i=0;i+1<C->ArrNZ;i++)
    {
        if(C->data[i].number==0)
        {
            for(j=i;j+1<C->ArrNZ;j++)
            {
                C->data[j].line=C->data[j+1].line;
                C->data[j].column=C->data[j+1].column;
                C->data[j].number=C->data[j+1].number;
            }
            C->ArrNZ--;
            i--;
        }
    }
    if(C->data[C->ArrNZ-1].number==0)
        C->ArrNZ--;
}
void Print(SPA *C)
{
    int i,j,k=0,z=0,d=0,flag;
    printf("\n");
    printf("\nC->Arrline= %d",C->Arrline);
    printf("\nC->Arrclou= %d",C->Arrclou);
    printf("\nC->ArrNZ= %d\n",C->ArrNZ);
    for(i=1;i<=C->Arrline;i++)//行
    {
        for(j=1;j<=C->Arrclou;j++)//列
        {
            flag=0;
            for(k=d;k<C->ArrNZ;k++)
            {
                if( (i==C->data[d].line) && (j==C->data[d].column) )
                {
                    printf("%-2d",C->data[d++].number);
                    flag=1;
                }
            }
            if(flag==0)
                printf("%-2d",z);//输出 零
        }
        printf("\n");
    }   
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。