我的方法是,将三元组表以链表存储。先比较行值,在比较列值,值小的在前,若行值列值都相等则相加判断是否为零,为零则删除。
但是不知道为什么一直过不了,我用另外一个可以通过测例的做法试了,与三元组表是否规范并无联系。
求助哇
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int row;
int col;
int data;
struct node *next;
}Triple;
typedef struct{
int len;
Triple *tr;
}TSMatrix,*pTSMatrix;
void Init(pTSMatrix T); //初始化
void Create(pTSMatrix T,int n); //创建有n组数的三元组表
pTSMatrix add(pTSMatrix TA,pTSMatrix TB); //将两个矩阵相加返回对应三元组表
void work(pTSMatrix TA,pTSMatrix TB,pTSMatrix TC); //完成任务的函数
void display(pTSMatrix T);
int main()
{
pTSMatrix TA,TB,TC;
TA=(pTSMatrix)malloc(sizeof(TSMatrix));
TB=(pTSMatrix)malloc(sizeof(TSMatrix));
TC=(pTSMatrix)malloc(sizeof(TSMatrix));
Init(TA);
Init(TB);
Init(TC);
work(TA,TB,TC);
}
void work(pTSMatrix TA,pTSMatrix TB,pTSMatrix TC)
{
int a,b,i;
scanf("%d%d",&a,&b);
Create(TA,a);
Create(TB,b);
TC=add(TA,TB);
display(TA);
}
void Init(pTSMatrix T)
{
T->tr=(Triple*)malloc(sizeof(Triple));
T->tr->next=NULL;
}
void Create(pTSMatrix T,int n)
{
int i,a,b,c;
Triple *p,*s;
T->len=n;
p=T->tr;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
s=(Triple*)malloc(sizeof(Triple));
s->row=a;s->col=b;s->data=c;
s->next=p->next;
p->next=s;
p=s;
}
}
pTSMatrix add(pTSMatrix TA,pTSMatrix TB)
{
Triple *pa,*pb,*pc;
pa=TA->tr;
pb=TB->tr;
pc=TA->tr;
if(pa->next==NULL) return TB;//若有一个矩阵全为零,则直接返回另外一个矩阵
if(pb->next==NULL) return TA;
pa=pa->next;
pb=pb->next;
while(pa!=NULL&&pb!=NULL)
{
if(pa->row<pb->row)
{
pc->next=pa;
pa=pa->next;
}
else if(pa->row>pb->row)
{
pc->next=pb;
pb=pb->next;
}
else
{
if(pa->col<pb->col)
{
pc->next=pa;
pa=pa->next;
}
else if(pa->col>pb->col)
{
pc->next=pb;
pb=pb->next;
}
else
{
pa->data=pa->data+pb->data;
if(pa->data==0)
{
pa=pa->next;
pb=pb->next;
}
else
{
pc->next=pa;
pa=pa->next;
pb=pb->next;
}
}
}
pc=pc->next;
}
if(pa!=NULL) pc->next=pa;
if(pb!=NULL) pc->next=pb;
return TA;
}
void display(pTSMatrix T)
{
Triple *p;
p=T->tr->next;
while(p!=NULL){
if(p->data!=0) printf("%d %d %d\n",p->row,p->col,p->data);
p=p->next;
}
}