Python菜菜 2021-05-26 12:57 采纳率: 0%
浏览 38

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

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

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

求助哇

#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;
	}
}
  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-05-27 14:04
    关注

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

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配