一元多项式的相加与相乘

一元多项式的相加与相乘

实验目的:
       写出一元多项式相乘的程序和一元多项式相加并调试通过。
实验要求:
           
1、写出一元多项式的横向输出方式,当系数为零时,要求重新输入数据。
2、把加法改写成Lc=La+Lb,方便进行 Lc=La*Lb

程序已知的BUG,在考虑健壮性的时候,要考虑到当输入系数为0的时候,要求重新输入,而我的程序,输入第一个多项式,输入系数为0错误,给出提示,重新输入,后面的代码不正常,而输入第二个多项式,一旦输入系数为0,虽然也给出提示,但是后面的结果运算不正确。本人比较懒,就没有修改,这种Bug请大家自行修改!
实验代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define null 0

typedef struct {
	float coef;					//系数
	int expn;					//指数
} term;

typedef  int status;

typedef struct Lnode {
	term data;
	struct Lnode *next;			//指针域
}*Link,*Linklist;				//课本31页 两个名字是等价的

int cmp(term a,term b) {		//比较函数,依a的指数值<(或=、或>)b的指数值,分别返回-1、0、和+1
	if (a.expn==b.expn) return 0;
	else return (a.expn-b.expn)/abs(a.expn-b.expn);
}

int comp(Link a, Link b)
//比较两结点指数大小,根据情况返回不同值
{
	if (a->data.expn<b->data.expn) return  -1;
	else if(a->data.expn == b->data.expn) return  0;
	else return 1;
}

void Orderinsert(Linklist &L,term e,int (*comp)(term,term)) {	// 顺序插入
	Link o,p,q;
	q=L;
	p=q->next;
	while (p&&comp(p->data,e)<0) {
		q=p;
		p=p->next;
	}
	o=(Link)malloc(sizeof(Lnode));
	o->data=e;
	q->next=o;
	o->next=p;
}

status LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term)) {
	Link p;
	s=L;
	p=s->next;
	while (p&&comp(p->data,e)!=0) {
		s=p;
		p=p->next;
	}
	if(!p) {
		s=q=null;
		return 0;
	} else {
		q=p;
		return 1;
	}
}

void Delnext(Linklist &L,Link s) {
	Link q=s->next;
	s->next=q->next;
	free(q);
}

void Orderinsertmerge(Linklist &L,term e,int (*compara)(term,term)) {
	Link q,s;
	if (LocateElem(L,e,s,q,compara)) {
		q->data.coef+=e.coef;
		if (!q->data.coef) {
			Delnext(L,s);
		}
	} else  Orderinsert(L,e,compara);
}

void Creatpolyn (Linklist &p,int m) {
	term e;
	int i;
	p=(Link)malloc(sizeof(Lnode));
	p->next=null;
	printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
	do{
		for(i=0; i<m; i++) {
			scanf("%f%d",&e.coef,&e.expn);
			if(0.0 == e.coef) {
				printf("系数不能为0\n请重新输入: ");
				scanf("%f%d",&e.coef,&e.expn);
			} else Orderinsertmerge(p,e,cmp);
		}
	}while(0.0==e.coef);
}
/*void add(Linklist &La,Linklist Lb) { //请把这个函数修改成void add(Linklist La,Linklist Lb,Linklist &Lc)实现Lc=La+Lb
	Link qb;
	term b;
	qb=Lb->next;
	while(qb) {
		b=qb->data;
		Orderinsertmerge(La,b,cmp);
		qb=qb->next;
	}
}*/

void add3(Linklist &La,Linklist &Lb,Linklist &Lc)//pa,pb均指向头结点
//两个多项式相加得一个新多项式,并且返回新多项式的头结点的指针
{
	Link  p, q, s, pc;
	float sum;
	term a;
	term b;
	p = La->next;
	q = Lb->next;
	Lc=(Link)malloc(sizeof(Lnode)); //新多项式的头结点
	pc = Lc;	//pc指向新多项式的头结点
	while(p&&q) {
		switch(comp(p, q)) {
			case -1:// //若指数:p<q,则将p所指结点链入头结点为Lc的链表中,且p向后遍历
				s = (Link)malloc(sizeof(Lnode));
				s->data.coef = p->data.coef;
				s->data.expn = p->data.expn;
				pc->next = s;
				pc = s;
				p = p->next;
				break;
			case 0://若比较两项的指数相等,则将两项系数相加后得到的项放入头结点为Lc的链表中 ,且p,q同时向后遍历
				sum = p->data.coef+q->data.coef;
				if(sum!=0.0) { //若两项系数相加为0,则不放入头结点为Lc的链表中
					s = (Link)malloc(sizeof(Lnode));
					s->data.coef = sum;
					s->data.expn = p->data.expn;
					pc->next = s;
					pc = s;
				}
				p = p->next;
				q = q->next;
				break;
			case 1://若指数:q<p,则将q所指结点链入头结点为Lc的链表中,且q向后遍历
				s = (Link)malloc(sizeof(Lnode));
				s->data.coef = q->data.coef;
				s->data.expn = q->data.expn;
				pc->next = s;
				pc = s;
				q = q->next;
				break;
		}
	}
	pc->next=p?p:q;//链入pa或pb的剩余项
}


//此处请添加一个一元多项式乘法函数
void mul(Linklist &La,Linklist &Lb,Linklist &Lc) {
	Link qa,qb,qc;
	term e;
	qa=La->next;
	qc=Lc;
	while(qa) {
		qb=Lb->next;
		while(qb) {
			e.coef = qa->data.coef * qb->data.coef;
			e.expn = qa->data.expn + qb->data.expn;
			if(e.coef != 0.0) Orderinsertmerge(qc,e,cmp);
			qb=qb->next;
		}
		qa=qa->next;
	}
}


void printpolyn(Linklist p) {
	Link q;
	q=p->next;
	printf("    系数    指数\n");
	while(q) {
		printf("%8.2f  %-d\n",q->data.coef,q->data.expn);
		q=q->next;
	}
}

//此处请添加一个横向输出一元多项式的程序PrintList(),考虑情况要全面

void PrintList(Linklist p) {
	Link q;
	q=p->next;
	printf("P(x) = ");
	if(q==null) {
		printf("0\n");
		return ;
	}
	printf("%.2f*X^%d ",q->data.coef,q->data.expn);
	q=q->next;
	while(q) {
		if(q->data.coef>0)
			printf("+ %.2f*X^%d ",q->data.coef,q->data.expn);
		else  if(q->data.coef<0)
			printf("- %.2f*X^%d ",-q->data.coef,q->data.expn);
		q=q->next;
	}
	printf("\n");
}

int main() {
	int x;
	Linklist L1,L2,L3;
	printf("\n请输入第一个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L1,x);
	printpolyn(L1);
	printf("\nL1=");
	PrintList(L1);
	printf("\n请输入第二个一元多项式的项数:");
	scanf("%d",&x);
	Creatpolyn(L2,x);
	printpolyn(L2);
	printf("\nL2=");
	PrintList(L2);
	/*add(L1,L2);
	printf("\n相加以后的一元多项式为:\n");
	printpolyn(L1);
	printf("\nL1+L2=");
	PrintList(L1);*/

	printf("请输入要选择的运算(+ , *): ");
	char ch1;
	getchar();		//清除掉缓冲区的回车符
	scanf("%c",&ch1);
	getchar();		//清除掉缓冲区的回车符
	switch(ch1) {
		case '+': {
			Creatpolyn(L3,0);
			add3(L1,L2,L3);
			printf("\n相加以后的一元多项式为:\n");
			printpolyn(L3);
			PrintList(L3);
		}
		break;
		case '*': {
			Creatpolyn(L3,0);
			mul(L1,L2,L3);
			printf("\n相乘以后的一元多项式为:\n");
			printpolyn(L3);
			PrintList(L3);
		}
		break;
		default:
			printf("您输入了错误指令 %c !",ch1);
	}
}

程序正确运行结果如下:
在这里插入图片描述
这种Bug没有精力改动了,毕竟光写这个代码,我都快猝死了,不介意给个赞吧,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值