本关任务:设计一种单链表存储结构,每个结点存储一项的系数和指数,类型都是整型,编写完成产生多项式的函数、多项式相加及输出多项式的函数。
相关知识
为了完成本关任务,你需要掌握:
-
如何存储一个一元多项式;
-
如何对一元多项式进行加法操作。
存储一元多项式
在数学上,一元多项式的形式:
pn(x)=p0+p1x1+p2x2+...+pnxn
可由线性表(p0,p1,...pn)表示。一般情况下,一元多项式只表示非0
系数项,采用链式存储,对应链表结点数据结构可采取:(设多项式的系数和指数都是整型)
struct node
{
int exp; //表示指数
int coef; //表示系数
struct node *next; //指向下一个结点的指针
};
多项式相加运算规则
两个一元多项式中所有指数相同的项,对于系数相加,若和不为0
,则构成结果多项式中的一项,对于两个多项式中所有指数不同的项,则分别复制到结果多项式中。
举例:
p(x)=5+2x+3x5−2x7
Q(x)=12x+2x7+13x15
则结果多项式为:
R(x)=5+14x+3x5+13x15
____________________________________________________________________________
输入输出一元多项式
输入时逐项、按顺序输入一元多项式的系数、指数,输入系数为0
时表述输入结束。
例如:
p(x)=5+2x+3x5−2x7
输入: 5 0 2 1 3 5 -2 7 0 0
输出时采取以下格式,若预期输出的多项式为:
p(x)=5+2x+3x5−2x7
则输出: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 <stdlib.h>
#include <stdio.h>
//存放多项式某项的结点结构
struct node
{
int coef ; //表示系数
int exp ; // 表示指数
struct node *next; //指向下一个结点的指针
};
typedef struct 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 < head2->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)
{
PNODE polyAddLeft, polyAddRight ,polyAddResult ;
polyAddLeft = createPoly();
polyAddRight = createPoly();
polyAddResult = addPoly(polyAddLeft,polyAddRight);
printPoly(polyAddResult);
destroyPoly(polyAddLeft);
destroyPoly(polyAddRight);
destroyPoly(polyAddResult);
}