本关任务:设计一种单链表存储结构,每个结点存储一项的系数和指数,类型都是整型,编写完成产生多项式的函数、多项式相加及输出多项式的函数。
相关知识
为了完成本关任务,你需要掌握:
如何存储一个一元多项式;
如何对一元多项式进行加法操作。
存储一元多项式
在数学上,一元多项式的形式:
pn(x)=p0+p1x1+p2x2+…+pnxn
可由线性表(p0,p1,…pn)表示。一般情况下,一元多项式只表示非0
系数项,采用链式存储,对应链表结点数据结构可采取:(设多项式的系数和指数都是整型)
struct node{int exp; //表示指数int coef; //表示系数struct node *next; //指向下一个结点的指针};
多项式相加运算规则
两个一元多项式中所有指数相同的项,对于系数相加,若和不为0
,则构成结果多项式中的一项,对于两个多项式中所有指数不同的项,则分别复制到结果多项式中。
举例:
p(x)=5+2x+3×5−2×7
Q(x)=12x+2×7+13×15
则结果多项式为:
R(x)=5+14x+3×5+13×15
____________________________________________________________________________
输入输出一元多项式
输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为0
时表述输入结束。
例如:
p(x)=5+2x+3×5−2×7
输入: 5 0 2 1 3 5 -2 7 0 0
输出时采取以下格式,若预期输出的多项式为:
p(x)=5+2x+3×5−2×7
则输出:5x^0 + 2x^1 + 3x^5 -2x^7
____________________________________________________________________________
编程要求
在右侧编辑器补充代码,实现相应函数。 创建多项式函数要求能在函数中输入多项式的各项 输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为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
____________________________________________________________________________
测试输入:
6 -1 5 0 7 9 0 0
-15 -2 9 9 18 12 0 0
预期输出:
-15x^-2 + 6x^-1 + 16x^9 + 18x^12
开始你的任务吧,祝你成功!
头文件LAB1.H
#ifndef _LAB1_H_#define_LAB1_H_#include #include //存放多项式某项的结点结构struct node{int coef ; //表示系数int exp ;// 表示指数struct node *next;//指向下一个结点的指针};typedefstruct node * PNODE ;/*函数功能:生成多项式函数名:createPoly函数参数:无返回值:指向多项式的头指针*/PNODE createPoly(void){//在此处填写代码,能实现创建一个多项式并返回多项式头指针的函数//注意:头指针不存放多项式的项。/**********Begin **********/PNODE head = (PNODE)malloc(sizeof(struct node));PNODE tail = head;int exp,coef;scanf("%d %d ",&coef,&exp);while(coef!=0){PNODE newnode = (PNODE)malloc(sizeof(struct node));if(newnode!=NULL){newnode->exp = exp;newnode->coef = coef;}newnode->next = NULL;tail->next = newnode;tail = newnode;scanf("%d %d",&coef,&exp);}return head;/**********End**********/}/*函数功能:进行多项式相加函数名:addPoly函数参数:polyAddLeft :加法左边多项式头指针, polyAddRight:加法右边多项式头指针返回值:指向结果多项式的头指针*/PNODE addPoly(PNODE polyAddLeft , PNODE polyAddRight){//在此处填写代码,能实现创两个多项式相加并返回结果多项式头指针的函数/**********Begin **********///为了方便操作,定义新的指针时刻表示链表的尾指针PNODE head1 = polyAddLeft->next;PNODE head2 = polyAddRight->next;//这是新链表的尾指针PNODE tail = polyAddLeft; //tail = 左链表的头指针。表示当前新链表的尾指针就while(head1!=NULL&&head2!=NULL){if(head1->exp exp){ //如果左链表结点次幂 小于 右链表,说明右链表中不存在可以和它相运算的项,它直接作为运算结果其中一向!//直接把左链表的结点连接到新链表上tail->next = head1;//更新新链表的尾指针tail = tail->next;//此时相当于把左节点的结点剪下来,然后放到新链表上,所以左链表需要向右移动一格。head1 = head1->next;}else if(head1->exp > head2->exp){//如果左链表结点次幂 大于 右链表,说明左链表中不存在可以和它相运算的项,它直接作为运算结果其中一向!tail->next = head2; //直接把右链表结点连接到新链表中tail = tail->next;//更新新链表的尾指针head2 = head2->next;//右链表移动一格(相当于删除去次幂小的那个结点)}else{ //假如次幂相等。head1->coef += head2->coef;//则系数相加然后放在左链表中tail->next = head1;//更新新链表的尾指针tail = tail->next;//左右两条链表同时向右移动一个结点head1 = head1->next;head2 = head2->next;}}//判断哪边链表到最后不为空,如果不为空,直接连接到新链表后边即可。if(head1!=NULL){tail->next = head1;}else tail->next = head2;//返回新链表的头指针return polyAddLeft;/**********End **********/}/*while函数功能:输出多项式函数名:printPoly函数参数:待输出多项式的头指针poly返回值:无*/void printPoly(PNODE poly){//在此处填写代码,能实现按格式输出多项式的功能,输出格式样例见说明/**********Begin **********/PNODE print_node = poly->next;printf("%dx^%d",print_node->coef,print_node->exp);print_node = print_node->next;while(print_node!=NULL){if(print_node->coef == 0);else{printf("+%dx^%d",print_node->coef,print_node->exp);}print_node = print_node->next;}/**********End **********/}void destroyPoly(PNODE poly){//释放存储多项式的链表空间PNODE now = poly->next;while(now!=NULL) {free(poly);poly = now;now = now->next;}}#endif
主函数:main.h
#include "../linklist.h"int main(void){PNODEpolyAddLeft, polyAddRight ,polyAddResult ;polyAddLeft = createPoly();polyAddRight = createPoly();polyAddResult = addPoly(polyAddLeft,polyAddRight); printPoly(polyAddResult);destroyPoly(polyAddLeft);destroyPoly(polyAddRight);destroyPoly(polyAddResult);}