210921-多项式算数问题(只有减价乘法,没有除法)

本文介绍了一种使用链表数据结构实现多项式加减乘运算的方法。通过定义多项式节点结构体,实现了多项式的读取、合并同类项、加法、减法及乘法等操作,并提供了一个主程序用于验证算法正确性。

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所在文件夹下自动生成)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huber Wong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值