稀疏多项式相加(C语言顺序表)

嗯嗯先上代码

#include <stdio.h>
#include <stdlib.h>
typedef struct data
{
	int coefficient;
	int index;
}data;
typedef struct Sqlist
{
	int length;
	data *elem;
}Sqlist;
//链表初始化 
void Init_List(Sqlist *p,int i)
{  
    p->elem=(data *)malloc(sizeof(data)*i);
    if(p->elem==NULL)
    {
   		printf("申请空间失败");
   	}
   	printf("请输入%d个系数值\n",i);
   	for(int j=0;j<i;j++)
   	{
   		scanf("%d",&p->elem[j].coefficient);
   	}
   	printf("请输入%d个指数值\n",i);
    for(int j=0;j<i;j++)
   	{
   		scanf("%d",&p->elem[j].index);
   	}
    p->length=i;
}
//销毁线性表
void Destroy_List(Sqlist *p)
{
    if(p->elem)
    {
    	free(p->elem);
	}
	printf("该线性表已经摧毁\n");
}
//打印数据函数
void Printf_List(Sqlist *p)
{
	printf("该表的数据为:\n");
	printf("系数:\n");
	for(int j=0;j<p->length;j++)
	{
	   	printf("%d\t",p->elem[j].coefficient);	
	}
	printf("\n");
	printf("指数:\n");
	for(int j=0;j<p->length;j++)
	{
	   	printf("%d\t",p->elem[j].index);	
	}
	printf("该表打印完成\n");
}
//稀疏多项式相加
void Sparse_polynomialList(Sqlist *LA,Sqlist *LB,Sqlist *LC)
{
	int pa=0,pb=0,pc=0;
	LC->length=LA->length+LB->length;
	LC->elem=(data *)malloc(sizeof(data)*LC->length);
	while(pa<=LA->length-1&&pb<=LB->length-1)
	{
		if(LA->elem[pa].index<LB->elem[pb].index)
		{
			LC->elem[pc].coefficient=LA->elem[pa].coefficient;
			LC->elem[pc].index=LA->elem[pa].index;
			pc++;
			pa++;
		}
		if(LA->elem[pa].index=LB->elem[pb].index)
		{   
			if(LA->elem[pa].coefficient+LB->elem[pb].coefficient==0)
			{
				pa++;
				pb++;
			}
			else
			{
				LC->elem[pc].coefficient=LA->elem[pa].coefficient+LB->elem[pb].coefficient;
				LC->elem[pc].index=LA->elem[pa].index;
				pc++;
				pa++;
				pb++;
			}
		}
		if(LA->elem[pa].index>LB->elem[pb].index)
		{
			LC->elem[pc].coefficient=LB->elem[pb].coefficient;
			LC->elem[pc].index=LB->elem[pb].index;
			pc++;
			pb++;	
		}
	}
	while(pa<=LA->length-1)
	{
	  	LC->elem[pc].coefficient=LA->elem[pa].coefficient;
		LC->elem[pc].index=LA->elem[pa].index;
		pc++;
		pa++; 		 		
	}
	while(pb<=LB->length-1)
	{
		LC->elem[pc].coefficient=LB->elem[pb].coefficient;
		LC->elem[pc].index=LB->elem[pb].index;
		pc++;
		pb++;	
	}
	while(pc<=LC->length-1)
	{
		LC->elem[pc].coefficient=0;
		LC->elem[pc].index=0;
		pc++;
	}
	printf("稀疏多项式相加完成\n");	
} 
int main()
{   Sqlist pa,pb,pc;
	Sqlist *LA=&pa,*LB=&pb,*LC=&pc;
	Init_List(LA,4);
	Init_List(LB,3);
	
	Printf_List(LA);
	printf("-----------------------------\n");
	Printf_List(LB);
	printf("-----------------------------\n");
	Sparse_polynomialList(LA,LB,LC);
	Printf_List(LC);
	printf("-----------------------------\n");
	Destroy_List(LA);
	Destroy_List(LB);
	Destroy_List(LC);
}

稀疏多项式是多项式算法的延申,只存了该存的数。因为普通多项式是按照顺序,而稀疏多项式算法是为了节约空间而设置的。

稀疏多项式算法

void Sparse_polynomialList(Sqlist *LA,Sqlist *LB,Sqlist *LC)
{
	int pa=0,pb=0,pc=0;
	LC->length=LA->length+LB->length;
	LC->elem=(data *)malloc(sizeof(data)*LC->length);
	while(pa<=LA->length-1&&pb<=LB->length-1)
	{
		if(LA->elem[pa].index<LB->elem[pb].index)
		{
			LC->elem[pc].coefficient=LA->elem[pa].coefficient;
			LC->elem[pc].index=LA->elem[pa].index;
			pc++;
			pa++;
		}
		if(LA->elem[pa].index=LB->elem[pb].index)
		{   
			if(LA->elem[pa].coefficient+LB->elem[pb].coefficient==0)
			{
				pa++;
				pb++;
			}
			else
			{
				LC->elem[pc].coefficient=LA->elem[pa].coefficient+LB->elem[pb].coefficient;
				LC->elem[pc].index=LA->elem[pa].index;
				pc++;
				pa++;
				pb++;
			}
		}
		if(LA->elem[pa].index>LB->elem[pb].index)
		{
			LC->elem[pc].coefficient=LB->elem[pb].coefficient;
			LC->elem[pc].index=LB->elem[pb].index;
			pc++;
			pb++;	
		}
	}
	while(pa<=LA->length-1)
	{
	  	LC->elem[pc].coefficient=LA->elem[pa].coefficient;
		LC->elem[pc].index=LA->elem[pa].index;
		pc++;
		pa++; 		 		
	}
	while(pb<=LB->length-1)
	{
		LC->elem[pc].coefficient=LB->elem[pb].coefficient;
		LC->elem[pc].index=LB->elem[pb].index;
		pc++;
		pb++;	
	}
	while(pc<=LC->length-1)
	{
		LC->elem[pc].coefficient=0;
		LC->elem[pc].index=0;
		pc++;
	}
	printf("稀疏多项式相加完成\n");	
} 

下面我会详细介绍这段代码

这里上面传进来三个线性表,同时我们将为LC申请空间,这个线性表存稀疏多项式相加的结果。相信大家对malloc已经很熟悉了。

 这里面的while就是遍历两个表,因为我们需要比较指数,如果pa的指数比较小我们就将pa的指数和系数都存在pc里,同时改变pc和pa的值,如果pb比较小的话也是如此。

主要是相等的情况如果系数相等我们需要判断系数相加是否为0,不为0就可以直接存在pc中同时pa++ pc++ pa++,为0就得跳过这个数据也就是pa++;pb++

pa指数如果大于pb指数,处理方法跟pa指数小于pb指数类似。当我们将一个表遍历完之后我们就将没完的表的数据接在pc后面即可也就是下面几段代码。

希望对大家有帮助。 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值