用三元组表作为存储结构实现两个矩阵相加

我的方法是,将三元组表以链表存储。先比较行值,在比较列值,值小的在前,若行值列值都相等则相加判断是否为零,为零则删除。

但是不知道为什么一直过不了,我用另外一个可以通过测例的做法试了,与三元组表是否规范并无联系。

求助哇

#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;
	}
}

 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。