#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小时内删除。
发表评论