PolynomialByHuber.cpp 文件
/*
此程序用于计算多项式的乘除法和加减法
注:用将数据结构设计为动态数组更为简单合理,但是为了实践链表的知识,所以用链表来实现程序
*/
/*
测试用例:2 1 2 3 4 2 1 2 3 4 ; 2 1 1 1 1
返回结果:
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
// 程序结构设计
typedef struct PolyNode *Polynomial;
struct PolyNode {
float coef;
int expon;
Polynomial link;
};
Polynomial ReadPoly(FILE *);
void Attach(float c, int e, Polynomial *pRear);
void PrintPoly(Polynomial P, FILE *);
Polynomial Mult(Polynomial P1, Polynomial P2);
Polynomial Add(Polynomial P1, Polynomial P2);
int Compare(int a, int b);
Polynomial Merger(Polynomial P);
Polynomial Sub(Polynomial P1, Polynomial P2);
int main(){
Polynomial P1, P2, PM, PA, PS;
FILE *in1 = fopen("./p1.txt", "r"),
*in2 = fopen("./p2.txt", "r"),
*out = fopen("./result.txt", "w");
if(in1 != NULL) printf("文件打开成功\n");
if(in2 != NULL) printf("文件打开成功\n");
if(out != NULL) printf("文件打开成功\n");
// 读入多项式1
P1 = ReadPoly(in1);
// PrintPoly(P1);
// 读入多项式2
P2 = ReadPoly(in2);
// PrintPoly(P2);
// 乘法运算并输出
PM = Mult(P1, P2);
fprintf(out, "\n==========下面是乘法运算的结果↓↓↓==========\n");
PrintPoly(PM, out);
// 加法运算并输出
PA = Add(P1, P2);
fprintf(out, "\n==========下面是加法运算的结果↓↓↓==========\n");
PrintPoly(PA, out);
// 减法运算并输出
PS = Sub(P1, P2);
fprintf(out, "\n==========下面是乘减运算的结果↓↓↓==========\n");
PrintPoly(PS, out);
printf("程序执行完毕,请查看 result.txt 文件");
fclose(in1);
fclose(in2);
fclose(out);
return 0;
}
Polynomial Merger(Polynomial P){
Polynomial p, mark, q;
for(mark = P; mark != NULL; mark = mark->link){
q = mark;
p = mark->link;
while(p){
if(mark->expon == p->expon){
mark->coef += p->coef;
q->link = p->link;
free(p);
p = q->link;
}
else{
q = p;
p = p->link;
}
}
}
// PrintPoly(P);
return P;
}
// 将项插入到多项式的尾部
void Attach(float c, int e, Polynomial *pRear) {
Polynomial P;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->coef = c; // 对新节点赋值
P->expon = e;
P->link = NULL;
(*pRear)->link = P;
*pRear = P; //修改 pRear 的值
}
// 读入多项式
Polynomial ReadPoly(FILE *in){
/*
P:链表头的空节点
*/
Polynomial P, Rear, t;
/*
c:多项式的项的系数
e:多项式的项的指数(阶数)
N:多项式的项的个数
*/
float c;
int e, N;
// printf("请输入多项式项的个数:");
// scanf("%d", &N);
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(!feof(in)){
// printf("\n请输入项:");
fscanf(in, "%d,%f\n", &e, &c);
Attach(c, e, &Rear); // 将当前输入的项插入多项式尾部
// printf("%d,%f\n",e,c);
}
// 删除临时生成的头结点
t = P;
P = P->link;
free(t);
return P;
}
// 两个多项式相加
Polynomial Add(Polynomial P1, Polynomial P2){
Polynomial front, rear, temp;
float sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear;
while(P1 && P2){
switch(Compare(P1->expon, P2->expon)){
case 1:
Attach(P1->coef, P1->expon, &rear);
P1 = P1->link;
break;
case -1:
Attach(P2->coef, P2->expon, &rear);
P2 = P2->link;
break;
case 0:
sum = P1->coef + P2->coef;
if(sum){
Attach(sum, P1->expon, &rear);
P1 = P1->link;
P2 = P2->link;
break;
}
}
}
for(; P1; P1 = P1->link){
Attach(P1->coef, P1->expon, &rear);
}
for(; P2; P2 = P2->link){
Attach(P2->coef, P2->expon, &rear);
}
rear->link = NULL;
temp = front;
front = front->link;
free(temp);
front = Merger(front);
return front;
}
//两多项式相减
Polynomial Sub(Polynomial P1, Polynomial P2){
Polynomial front, rear, temp;
float sum;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
front = rear;
while(P1 && P2){
// printf("okle");
switch(Compare(P1->expon, P2->expon)){
case 1:
Attach(P1->coef, P1->expon, &rear);
P1 = P1->link;
break;
case -1:
Attach(-(P2->coef), P2->expon, &rear);
P2 = P2->link;
break;
case 0:
sum = P1->coef - P2->coef;
if(sum == 0){
P1 = P1->link;
P2 = P2->link;
break;
}else{
Attach(sum, P1->expon, &rear);
P1 = P1->link;
P2 = P2->link;
break;
}
}
}
for(; P1; P1 = P1->link){
Attach(P1->coef, P1->expon, &rear);
}
for(; P2; P2 = P2->link){
Attach(-(P2->coef), P2->expon, &rear);
}
rear->link = NULL;
temp = front;
front = front->link;
free(temp);
front = Merger(front);
return front;
}
// 两个多项式相乘
Polynomial Mult(Polynomial P1, Polynomial P2) {
Polynomial P, Rear, t1, t2, t;
float c;
int e;
if(!P1 || !P2){
return NULL;
}
t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P;
while(t2){
// 先用 P1 的第一项乘以 P2,得到 P
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while(t1){
t2 = P2;
Rear = P;
while(t2){
e = t1->expon + t2->expon;
c = t1->coef * t2->coef;
while(Rear->link && Rear->link->expon > e){
Rear = Rear->link;
}
if(Rear->link && Rear->link->expon == e){
if(Rear->link->coef + c){
Rear->link->coef += c;
}
else{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->coef = c;
t->expon = e;
t->link = Rear->link;
Rear->link = t;
Rear->link = t;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P;
P = P->link;
free(t2);
P = Merger(P);
return P;
}
int Compare(int a, int b){
return a >= b ? (a == b ? 0 : 1): -1;
}
// 将多项式输出
void PrintPoly(Polynomial P, FILE *out){
int flag = 0; // 辅助调整输出格式用
if(!P){
fprintf(out, "0 0\n");
return ;
}
while(P){
if(!flag){
flag = 1;
}
else{
printf(" ");
}
fprintf(out, "%d,%g\n", P->expon,P->coef);
P = P->link;
}
fprintf(out, "\n");
}
p1.txt 文件(按老师要就的格式就行;但是必须要有,并且要放在PolynomialByHuber.cpp 同一目录下)
2,2.0
4,3.0
p2.txt 文件(同上)
2,1.0
4,3.0
result.txt 文件(这个文件会在PolynomialByHuber.cpp所在文件夹下自动生成)
本文介绍了一种使用链表数据结构实现多项式加减乘运算的方法。通过定义多项式节点结构体,实现了多项式的读取、合并同类项、加法、减法及乘法等操作,并提供了一个主程序用于验证算法正确性。
576

被折叠的 条评论
为什么被折叠?



