注:以下代码是根据个人理解所写,与教学视频中代码略有出入,如有错误,烦劳指出。
( 1 ) 3 x 4 − 5 x 2 + 6 x − 2 (1) 3x^4-5x^2+6x-2 (1)3x4−5x2+6x−2 ( 2 ) 5 x 20 − 7 x 4 + 3 x (2) 5x^{20}-7x^4+3x (2)5x20−7x4+3x ( 1 ) + ( 2 ) = 5 x 20 − 4 x 4 − 5 x 2 + 9 x − 2 (1)+(2)=5x^{20}-4x^4-5x^2+9x-2 (1)+(2)=5x20−4x4−5x2+9x−2 ( 1 ) × ( 2 ) = 15 x 24 − 25 x 22 + 30 x 21 − 10 x 20 − 21 x 8 + 35 x 6 − 33 x 5 + 14 x 4 − 15 x 3 + 18 x 2 − 6 x (1) \times (2)=15x^{24}-25x^{22}+30x^{21}-10x^{20}-21x^8+35x^6-33x^5+14x^4-15x^3+18x^2-6x (1)×(2)=15x24−25x22+30x21−10x20−21x8+35x6−33x5+14x4−15x3+18x2−6x
输入示例:(第一个数字代表项数,接下来的每两个数字分别对应每一项的系数和指数) 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1
输出示例:(第一行表示乘积结果,第二行表示和的结果。每两个数字分别代表项的系数和指数。) 15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 5 20 -4 4 -5 2 9 1 -2 0
main.c文件
#include<stdio.h> #include<stdlib.h> #include"Poly.h" int main(void) { Polynomial p1=NULL, p2=NULL, pp=NULL, ps=NULL; //读入多项式p1、p2 p1 = ReadPoly(); p2 = ReadPoly(); //p1、p2相乘并输出结果 pp = Mult(p1, p2); PrintPoly(pp); //p1、p2相加并输出结果 ps = Add(p1, p2); PrintPoly(ps); //释放空间 FreePoly(p1); FreePoly(p2); FreePoly(pp); FreePoly(ps); system("pause"); return 0; }Poly.h文件
#include<stdio.h> #include<stdlib.h> struct PolyNode { int coef;//系数 int expon;//指数 struct PolyNode *link; }; typedef struct PolyNode *Polynomial; Polynomial ReadPoly(void); Polynomial Mult(Polynomial, Polynomial); Polynomial Add(Polynomial, Polynomial); void PrintPoly(Polynomial); void Attach(int, int, Polynomial *); void FreePoly(Polynomial);ReadPoly.c文件
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include"Poly.h" Polynomial ReadPoly(void) { Polynomial p = NULL, rear = NULL; int c = 0, e = 0, n = 0, i = 0; //读出一共多少项 scanf("%d", &n); //生成链表头空节点 p = (Polynomial)malloc(sizeof(struct PolyNode)); p->link = NULL; rear = p; //将当前项插入多项式尾部 for (i = 0; i < n; i++) { scanf("%d %d", &c, &e); Attach(c, e, &rear); } //删除临时生成的头结点 rear = p; p = p->link; free(rear); return p; } void Attach(int c, int e, Polynomial *rear) { Polynomial p; //创建新节点存储信息 p = (Polynomial)malloc(sizeof(struct PolyNode)); p->coef = c; p->expon = e; p->link = NULL; //将新节点接入链表后面并让rear指向新节点 (*rear)->link = p; (*rear) = p; }Add.c文件
#include<stdio.h> #include<stdlib.h> #include"Poly.h" Polynomial Add(Polynomial p1, Polynomial p2) { Polynomial t1 = p1, t2 = p2,p=NULL,rear=NULL,t=NULL; //建立一个空的节点,rear指向 p = (Polynomial)malloc(sizeof(struct PolyNode)); p->coef = 0; p->expon = 0; p->link = NULL; rear = p; while (t1&&t2) { //在rear指向的节点之后建立新的节点用于存储相加结果 rear->link = (Polynomial)malloc(sizeof(struct PolyNode)); //如果两个多项式的当前项指数相同,结果为系数相加,指数不变 if (t1->expon == t2->expon) { rear->link->expon = t1->expon; rear->link->coef = t1->coef + t2->coef; t1 = t1->link; t2 = t2->link; if (rear->link->coef == 0) { free(rear->link); } else { rear = rear->link; } } //如果两个多项式的当前项指数不同,将指数较大的先放入结果多项式中。 else if (t1->expon > t2->expon) { rear = rear->link; rear->expon = t1->expon; rear->coef = t1->coef; t1 = t1->link; } else { rear = rear->link; rear->expon = t2->expon; rear->coef = t2->coef; t2 = t2->link; } rear->link = NULL; } //当一个t1或者t2有一个已经为NULL之后,将还没有等于NULL的那一个单独处理。 while (t1) { //在rear指向的节点之后建立新的节点用于存储相加结果 rear->link = (Polynomial)malloc(sizeof(struct PolyNode)); rear = rear->link; rear->expon = t1->expon; rear->coef = t1->coef; rear->link = NULL; t1 = t1->link; } while (t2) { //在rear指向的节点之后建立新的节点用于存储相加结果 rear->link = (Polynomial)malloc(sizeof(struct PolyNode)); rear = rear->link; rear->expon = t2->expon; rear->coef = t2->coef; rear->link = NULL; t2 = t2->link; } //删除头节点 rear= p; p = p->link; free(rear); return p; }Mult.c文件
#include<stdio.h> #include<stdlib.h> #include"Poly.h" Polynomial Mult(Polynomial p1, Polynomial p2) { Polynomial currentPtr1 = NULL, currentPtr2 = NULL,pp=NULL,pptemp=NULL,rear=NULL; //将p1的每一项与p2单独相乘,得到的多项式再累加 for (currentPtr1 = p1; currentPtr1!=NULL; currentPtr1 = currentPtr1->link) { //pptemp指向p1当前项与p2相乘得到的多项式,以下建立一个头节点 pptemp = (Polynomial)malloc(sizeof(struct PolyNode)); pptemp->link = NULL; rear = pptemp; //创建节点存储p1当前项与p2相乘的结果 for (currentPtr2 = p2; currentPtr2 != NULL; currentPtr2 = currentPtr2->link) { Attach(currentPtr1->coef*currentPtr2->coef, currentPtr1->expon + currentPtr2->expon, &rear); } //删除pptemp头节点 rear = pptemp; pptemp = pptemp->link; free(rear); rear = NULL; //将结果累加 pp = Add(pp, pptemp); //清空p1当前项与p2多项式相乘的结果,以便存储p1下一项与p2相乘结果 FreePoly(pptemp); pptemp = NULL; } return pp; }PrintPoly.c文件
#include<stdio.h> #include<stdlib.h> #include"Poly.h" void PrintPoly(Polynomial p) { while (p!=NULL) { printf("%d %d ", p->coef, p->expon); p = p->link; } printf("\n"); }FreePoly.c文件
#include<stdio.h> #include<stdlib.h> #include"Poly.h" void FreePoly(Polynomial p) { Polynomial currentPtr = NULL; while (p != NULL) { currentPtr = p->link; free(p); p = currentPtr; } }