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
    评论
好的,我可以回答这个问题。单链表可以作为存储一元多项式的一种数据结构。相加两个一元多项式的方法是将两个一元多项式中相同次数的项相加,得到新的一元多项式。 具体步骤如下: 1. 定义一个单链表数据结构来存储一元多项式。 2. 读入两个一元多项式并分别存储到两个单链表中。 3. 遍历两个链表,将相同次数的项相加,将结果存储到一个新的链表中。 4. 如果一个链表遍历完了而另一个链表还有剩余的项,将这些项直接添加到新链表中。 5. 输出新链表中的每一项,即为相加的结果。 代码实现可参考下面示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct node { int coeff; //系数 int expn; //指数 struct node *next; } Node; Node* CreateList(); //创建链表 Node* InputPoly(); //输入一元多项式 void AddPoly(Node*, Node*, Node*); //相加两个一元多项式 void PrintPoly(Node*); //输出一元多项式 int main() { Node *A, *B, *C; A = InputPoly(); B = InputPoly(); C = CreateList(); AddPoly(A, B, C); PrintPoly(C); return 0; } Node* CreateList() { Node *L = (Node*)malloc(sizeof(Node)); L->next = NULL; return L; } Node* InputPoly() { Node *L = CreateList(); Node *r = L; int n, coeff, expn; printf("请输入一元多项式的项数:"); scanf("%d", &n); printf("请按照指数递减的顺序输入各项系数和指数:\n"); while(n--) { Node *p = (Node*)malloc(sizeof(Node)); scanf("%d%d", &coeff, &expn); p->coeff = coeff; p->expn = expn; r->next = p; r = p; } r->next = NULL; return L; } void AddPoly(Node *A, Node *B, Node *C) { Node *pa = A->next, *pb = B->next; Node *pc = C; while(pa && pb) { Node *p = (Node*)malloc(sizeof(Node)); if(pa->expn == pb->expn) { p->coeff = pa->coeff + pb->coeff; p->expn = pa->expn; pa = pa->next; pb = pb->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } else if(pa->expn > pb->expn) { p->coeff = pa->coeff; p->expn = pa->expn; pa = pa->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } else { p->coeff = pb->coeff; p->expn = pb->expn; pb = pb->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } } pc->next = pa ? pa : pb; } void PrintPoly(Node *L) { Node *p = L->next; while(p) { printf("%dX^%d", p->coeff, p->expn); p = p->next; if(p) printf("+"); } printf("\n"); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值