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+3x5−2x7
即输入: 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
请按任意键继续. . .
到此就完成了一元多项式的相加了,觉得有用的小伙伴记得点个赞噢,嘿嘿~