C语言实现一元多项式相加

C语言 链表实现一元多项式相加

  • 这里的代码复制后,可以直接运行,按照规定的输入即可得出多项式的结果。

问题描述

  • 设计一种单链表存储结构,每个节点成员有一个系数和一个指数,以及下一个节点的指针,数据类型都是整型,要求:实现多项式输入、相加、输出相加后的多项式。

规则:输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为  0  时表述输入结束,如  p ( x ) = 5 + 2 x + 3 x 5 − 2 x 7 规则:输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为\ 0\ 时表述输入结束,如 \ p(x)=5+2x+3x^5−2x^7 规则:输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为 0 时表述输入结束,如 p(x)=5+2x+3x52x7

​ 即输入: 5 0 2 1 3 5 -2 7 0 0
举例:

A(x)=5+2x+3x^5 −2x^7
B(x)=12x+2x^7 +13x^15
则结果多项式为:
C(x)=5+14x+3x^5 +13x^15

  • 这里构建链表创建函数,带头结点的链表,除了头指针,每一个节点存放一个系数和一个指数,通过循环实现输入并存到链表中,最后返回链表的头指针。
#include <stdlib.h>
#include <stdio.h> 


//存放多项式某项的结点结构 
struct node
{
  int exp ;  // 表示指数
  int coef ; //表示系数
  struct node *next;  //指向下一个结点的指针 
};

typedef  struct node * PNODE ;

/*
  函数功能:生成多项式
  函数名:createPoly
  函数参数:无
  返回值:指向多项式的头指针 
*/
PNODE createPoly(void)
{
    //在此处填写代码,能实现创建一个多项式并返回多项式头指针的函数
	//注意:头指针不存放多项式的项。 
    /**********  Begin **********/
 	PNODE head, temp;
	int coef, exp;
	scanf("%d", &coef);
	scanf("%d", &exp);
	
	head=(PNODE)malloc(sizeof(struct node));
	if(head==NULL)
		return 0;
	head->next=NULL; temp=head;
	
	while(coef!=0 || exp!=0)
	{
		PNODE p = (PNODE)malloc(sizeof(struct node));
		if(p==NULL) 
			return 0;
		p->next=NULL;
			
		p->coef=coef;
		p->exp=exp;
		
		if(head->next==NULL)
		{
			temp->next=p;
			temp=p;
		}
		else if(temp->next==NULL)
		{
			temp->next = p;
			temp=p;
		}
		scanf("%d", &coef);
		scanf("%d", &exp);
	} 
    return head;
    /**********  End  **********/
} 
  

  • 下面函数addPoly()用于实现两个多项式相加,创建存放相加结果的链表temp,进入循环,只有AB多项式都为空时跳出,判断其中一个多项式当前节点是否为空,若为空,则当前节点往后相加的结果就是另一个多项式;如果不为空的话,判断对应节点的指数是否相同,相同,再判断当前系数和是否为零,若为零,则AB往下一个节点,temp不存返回结果为零的节点,保持原位,若不为零,temp存放两个节点相加的结果,然后都往下一个节点;如果其中一个多项式的节点指数比另一个指数小,则将小的多项式对应的节点存放到temp中去;所有结果考虑完了,跳出循环,并返回相加后的多项式的的头指针。
/*
   函数功能:进行多项式相加
   函数名:addPoly
   函数参数:polyAddLeft :加法左边多项式头指针, polyAddRight:加法右边多项式头指针 
   返回值:指向结果多项式的头指针 
*/
PNODE addPoly(PNODE polyAddLeft , PNODE polyAddRight)
{
    //在此处填写代码,能实现创两个多项式相加并返回结果多项式头指针的函数
    /**********  Begin **********/
 	PNODE p, q;
 	PNODE tail, temp;
// 	PNODE tail, temp=(PNODE)malloc(sizeof(struct node));
// 	temp->next=NULL;
// 	if(temp==NULL) return 0;
 	int sum=0;
 	
 	p=polyAddLeft->next;
	q=polyAddRight->next;
	tail=p;
	
	while(p||q)
	{
		if(p->exp > q->exp)
		{
			temp=q;
			q->next=tail->next;
			tail->next=q;
			tail=tail->next;
			
			
			q=q->next;
			free(temp);
		}
		else if(p->exp < q->exp)
		{
			tail=tail->next;
			p=p->next;	
		}
		else
		{
			sum=p->coef + q->coef;
			if(sum!=0)
			{
				temp=p;
				p->coef=sum;
				tail=tail->next;
				p=p->next;
				
				temp=q;
				q=q->next;
				free(temp);
			}
			else
			{
				temp=p;
				p=p->next;
				free(temp);
				
				temp=q;
				q=q->next;
				free(temp);
			}
		}
	} 
    
    if(p) 
		tail->next=p;
	else 
		tail->next=q;
		
    free(polyAddRight);
    return polyAddLeft;
    /**********  End **********/
}  
  

  • 下面是链表输出函数、销毁函数、主函数的创建。
/*
   函数功能:输出多项式 
   函数名:printPoly
   函数参数:待输出多项式的头指针poly 
   返回值:无 
*/
 void printPoly(PNODE poly)
 {
 	//在此处填写代码,能实现按格式输出多项式的功能,输出格式样例见说明 
    /**********  Begin **********/
 	PNODE p;
 	p=poly->next;
 	while(p)
 	{
 		if(p->next==NULL)
 			printf("%dx^%d", p->coef, p->exp);
 			
 		else
 		    printf("%dx^%d + ", p->coef, p->exp);
 		p = p->next;
	}
    
    /**********  End **********/
}  

void destroyPoly(PNODE poly)
{
//释放存储多项式的链表空间
	PNODE p=poly, temp;
	while(p!=NULL)
	{
		temp=p;
		p=p->next;
		free(temp);
	}
}

int main(void)
{
	PNODE p, q, poly;
	p=createPoly();
//	printPoly(p);
	q=createPoly();
//	printPoly(q);
	poly=addPoly(p, q);
	printPoly(poly);
	destroyPoly(poly);
	return 0;
}

下面是结果测试

输入:
5 0 2 1 3 5 -2 7 0 0
12 1 2 7 13 15 0 0

输出:
5x^0+14x^1+3x^5+13x^15

终端exe
5 0 2 1 3 5 -2 7 0 0
12 1 2 7 13 15 0 0
5x^0+14x^1+3x^5+13x^15
--------------------------------
Process exited after 1.164 seconds with return value 0
请按任意键继续. . .

到此就完成了一元多项式的相加了,觉得有用的小伙伴记得点个赞噢,嘿嘿~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值