链表实现多项式的加法和乘法

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(PolyNode)

typedef struct node{      //声明多项式节点的结构体表示
	float coef;       //系数
	int exp;          //指数
	struct node* next;
}PolyNode;           //多项式节点
typedef PolyNode* Polynomial;   

Polynomial create(){            //输入并创建链表的函数
	Polynomial p,q,head=(Polynomial)malloc(LEN);
	float coef;
	int exp;
	head->next=NULL;
	printf("Please enter the coef and exp,ending with '0 0':");
	while(scanf("%f %d",&coef,&exp)&&coef){
		if(head->next){
			p=head;
			while(p->next&&exp<p->next->exp)      //找到要插入的位置,插在p节点的后面
				p=p->next;
			if(p->next){
				if(p->next->exp==exp){                 //有相同指数时直接加到原来的节点上
					p->next->coef+=coef;
					if(p->next->coef>-0.000001&&p->next->coef<0.000001){  //若系数之和为零,则舍去该点,浮点运算存在误差
						q=p->next;
						p->next=q->next;
						free(q);
					}
				}
				else{
					q=(Polynomial)malloc(LEN);
					q->coef=coef;
					q->exp=exp;
					q->next=p->next;
					p->next=q;
				}
			}
			else{           //若要插入的系数最小,插在最末
				p->next=(Polynomial)malloc(LEN);
				p->next->coef=coef;
				p->next->exp=exp;
				p->next->next=NULL;
			}
		}
		else{           //插入第一个节点时
			head->next=(Polynomial)malloc(LEN);
			head->next->coef=coef;
			head->next->exp=exp;
			head->next->next=NULL;
		}
	}
	return head;
}

Polynomial add(Polynomial poly1,Polynomial poly2){             //将poly1,poly2相加得到一个新多项式链表poly3
	Polynomial p,q,r,poly=(Polynomial)malloc(LEN);    //poly为和多项式链表的头节点
	poly->next=NULL;
	r=poly;                 //r指向poly的最后一个节点
	p=poly1->next;
	q=poly2->next;
	while(p&&q){
		if(p->exp>q->exp){   
			r->next=(Polynomial)malloc(LEN);
			r=r->next;
			r->coef=p->coef;
			r->exp=p->exp;
			p=p->next;
		}
		else if(p->exp<q->exp){
			r->next=(Polynomial)malloc(LEN);
			r=r->next;
			r->coef=q->coef;
			r->exp=q->exp;
			q=q->next;
		}
		else{
			float m=p->coef+q->coef;
			if(!(m>-0.000001&&m<0.000001)){
				r->next=(Polynomial)malloc(LEN);
				r=r->next;
				r->coef=m;
				r->exp=p->exp;
			}
			p=p->next;
			q=q->next;
		}
	}
	while(p){        //若p中有剩余
		r->next=(Polynomial)malloc(LEN);
		r=r->next;
		r->coef=p->coef;
		r->exp=p->exp;
		p=p->next;
	}	
	while(q){       //若q中有剩余
		r->next=(Polynomial)malloc(LEN);
		r=r->next;
		r->coef=q->coef;
		r->exp=q->exp;
		q=q->next;
	}	
	r->next=NULL;
	return poly;
}

void polyAdd(Polynomial poly1,Polynomial poly2){          //把poly2加到poly1上,加完之后poly1为和多项式,poly2将被释放
	Polynomial p,q,t;
	q=poly2->next;
	while(q){
		p=poly1;
		while(p->next&&q->exp<p->next->exp)            //找到要插入poly1的位置,插在p与p->next之间
			p=p->next;
		if(p->next){            //插在poly1中间
			if(q->exp==p->next->exp){        //若要插入节点的系数等于p->next的系数
				float m=q->coef+p->next->coef;
				if(m>-0.000001&&m<0.000001){
					Polynomial tmp1=p->next;
					p->next=tmp1->next;
					free(tmp1);
				}
				else{
					p->next->coef=m;
				}
			}
			else{
				Polynomial tmp2=(Polynomial)malloc(LEN);
				tmp2->coef=q->coef;
				tmp2->exp=q->exp;
				tmp2->next=p->next;
				p->next=tmp2;
			}
		}
		else{                 //插在poly1末端
			p->next=(Polynomial)malloc(LEN);
			p->next->coef=q->coef;
			p->next->exp=q->exp;
			p->next->next=NULL;
		}
		t=q;
		q=q->next;
		free(t);
	}
	free(poly2);          //释放poly2的头节点
}

Polynomial multiply(Polynomial poly,float coef,int exp){    //多项式poly与单项coef^exp相乘,返回乘法之后的多项式链表
	Polynomial p,r,head=(Polynomial)malloc(LEN);
	head->next=NULL;
	r=head;
	p=poly->next;
	while(p){
		r->next=(Polynomial)malloc(LEN);
		r=r->next;
		r->coef=p->coef*coef;
		r->exp=p->exp+exp;
		p=p->next;
	}
	return head;
}

Polynomial polyMultiply(Polynomial poly1,Polynomial poly2){    //返回poly1*poly2的多项式链表
	Polynomial p,poly=(Polynomial)malloc(LEN);     //乘积多项式的头指针
	poly->next=NULL;
	p=poly2->next;
	while(p){
		polyAdd(poly,multiply(poly1,p->coef,p->exp));   //把poly1和poly2中的每一项相乘后求和
		p=p->next;
	}
	return poly;
}

void print(Polynomial poly){     //输出链表的函数
	if(poly&&poly->next){
		Polynomial p=poly->next;
		while(p){
			if(p->next==NULL){   //当p为最后一个节点时
				if(p->exp!=0) printf("%fx^%d",p->coef,p->exp);
				else printf("%f",p->coef);
			}
			else{
				printf("%fx^%d",p->coef,p->exp);
				if(p->next->coef>0) printf("+");
			}
			p=p->next;
		}
		printf("\n");
	}
	else 
		printf("0.000000\n");
}

void clear(Polynomial poly){    //释放内存
	if(poly&&poly->next){
		Polynomial p,q;
		p=poly;
		while(p){
			q=p->next;
			free(p);
			p=q;
		}
	}
	poly=NULL;
}

int main(){
	Polynomial p1,p2,p3,p4;
	printf("Please input p1:\n");
	p1=create();
	printf("Please input p2:\n");
	p2=create();
	printf("p1=");
	print(p1);
	printf("p2=");
	print(p2);
	p3=add(p1,p2);          //p3=p1+p2
	printf("p3=p1+p2=");
	print(p3);
	p4=polyMultiply(p1,p2);  //p4=p1*p2
	printf("p4=p1*p2=");
	print(p4);
	clear(p1);        //释放内存
	clear(p2);
	clear(p3);
	clear(p4);
	return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 链表是一种常用的数据结构,可以用来实现多项式的加减乘法。下面是 C 语言链表实现多项式的加减乘法的代码: ```c #include <stdio.h> #include <stdlib.h> // 多项式结点结构体定义 typedef struct PolyNode { int coef; // 系数 int expon; // 指数 struct PolyNode* next; } PolyNode; // 多项式结构体定义 typedef struct Poly { PolyNode* head; PolyNode* tail; } Poly; // 初始化多项式 void initPoly(Poly* poly) { poly->head = NULL; poly->tail = NULL; } // 添加多项式结点 void addNode(Poly* poly, int coef, int expon) { PolyNode* node = (PolyNode*)malloc(sizeof(PolyNode)); node->coef = coef; node->expon = expon; node->next = NULL; if (poly->tail == NULL) { poly->head = node; poly->tail = node; } else { poly->tail->next = node; poly->tail = node; } } // 输出多项式 void printPoly(Poly* poly) { PolyNode* p = poly->head; while (p != NULL) { printf("%dx^%d", p->coef, p->expon); if (p->next != NULL) { printf(" + "); } p = p->next; } printf("\n"); } // 释放多项式结点 void freePolyNode(PolyNode* node) { if (node != NULL) { freePolyNode(node->next); free(node); } } // 释放多项式 void freePoly(Poly* poly) { freePolyNode(poly->head); poly->head = NULL; poly->tail = NULL; } // 多项式加法 Poly addPoly(Poly* poly1, Poly* poly2) { Poly poly; initPoly(&poly); PolyNode* p1 = poly1->head; PolyNode* p2 = poly2->head; while (p1 != NULL && p2 != NULL) { if (p1->expon > p2->expon) { addNode(&poly, p1->coef, p1->expon); p1 = p1->next; } else if (p1->expon < p2->expon) { addNode(&poly, p2->coef, p2->expon); p2 = p2->next; } else { addNode(&poly, p1->coef + p2->coef, p1->expon); p1 = p1->next; p2 = p2->next; } } while (p1 != NULL) { addNode(&poly, p1->coef, p1->expon); p1 = p1->next; } while (p2 != NULL) { addNode(&poly, p2->coef, p2->expon); p2 = p2->next; } return poly; } // 多项式减法 Poly subPoly(Poly* poly1, Poly* poly2) { Poly poly; initPoly(&poly); PolyNode* p1 = poly1->head; PolyNode* p2 = poly2->head; while (p1 != NULL && p2 != NULL) { if (p1->expon > p2->expon) { addNode(&poly, p1->coef, p1->expon); p1 = p1->next; } else if (p1->expon < p2->expon) { addNode(&poly, -p2->coef, p2->expon); p2 = p2->next; } else { addNode(&poly, p1->coef - p2->coef, p1->expon); p1 = p1->next; p2 = p2->next; } } while (p1 != NULL) { addNode(&poly, p1->coef, p1->expon); p1 = p1->next; } while (p2 != NULL) { addNode(&poly, -p2->coef, p2->expon); p2 = p2->next; } return poly; } // 多项式乘法 Poly mulPoly(Poly* poly1, Poly* poly2) { Poly poly; initPoly(&poly); PolyNode* p1 = poly1->head; PolyNode* p2 = poly2->head; while (p1 != NULL) { while (p2 != NULL) { int coef = p1->coef * p2->coef; int expon = p1->expon + p2->expon; addNode(&poly, coef, expon); p2 = p2->next; } p1 = p1->next; p2 = poly2->head; } return poly; } // 测试 int main() { Poly poly1, poly2, poly3, poly4; initPoly(&poly1); initPoly(&poly2); initPoly(&poly3); initPoly(&poly4); addNode(&poly1, 3, 2); addNode(&poly1, 4, 1); addNode(&poly1, 5, 0); addNode(&poly2, 2, 1); addNode(&poly2, 1, 0); printf("poly1: "); printPoly(&poly1); printf("poly2: "); printPoly(&poly2); poly3 = addPoly(&poly1, &poly2); printf("poly1 + poly2: "); printPoly(&poly3); poly4 = subPoly(&poly1, &poly2); printf("poly1 - poly2: "); printPoly(&poly4); Poly poly5 = mulPoly(&poly1, &poly2); printf("poly1 * poly2: "); printPoly(&poly5); freePoly(&poly1); freePoly(&poly2); freePoly(&poly3); freePoly(&poly4); freePoly(&poly5); return 0; } ``` 上述代码中,`PolyNode` 结构体表示多项式的一项,`Poly` 结构体表示多项式。`initPoly` 函数用于初始化多项式,`addNode` 函数用于添加多项式结点,`printPoly` 函数用于输出多项式,`freePolyNode` 函数用于释放多项式结点,`freePoly` 函数用于释放多项式,`addPoly` 函数实现多项式加法,`subPoly` 函数实现多项式减法,`mulPoly` 函数实现多项式乘法。 在主函数中,我们创建了两个多项式 `poly1` 和 `poly2`,分别为 3x^2 + 4x + 5 和 2x + 1。然后进行了多项式加减乘法的测试,并最终释放了多项式的内存。 注意,上述代码只是实现多项式的加减乘法,还可以继续优化,例如优化多项式相加时的链表结构,以提高运行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值