一元稀疏多项式计算器

(1)设Pn(x)和Qn(x)分别为两个一元稀疏多项式,利用单链表存储Pn(x)和Qm(x)。

(2)从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出。

(3)实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x)。

(4)实现Pn(x)和Qm(x)相减,并输出两者的差Pn(x)-Qm(x)。

(5)就地逆置两者的差Pn(x)-Qm(x)。


实验代码:

#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef int Status;
typedef struct test{//定义多项式的存储结构 
	int xs;
	int zs;
	struct test *next;
}PolyNode,*PolyList;
PolyList p,q,r;
 
void createPolyList(PolyList *L){//创建多项式 
	(*L) = (PolyList)malloc(sizeof(PolyNode));
	(*L)->next = NULL;
	r=(*L);
	int xs,zs;
	scanf("%d %d",&xs,&zs);
	
	while(xs!=0){
        //生成新节点; 
 		p = (PolyList)malloc(sizeof(PolyNode));
		p->next = NULL;
		p->xs = xs;
		p->zs = zs; 
		//把新节点已尾接法方式插入链表;
		r->next=p; r=p;
		scanf("%d %d",&xs,&zs);
	}
}

void addPolyList(PolyList la,PolyList lb,PolyList *lc){//多项式加法 
	PolyList pa,pb,pc;
	
	(*lc) = (PolyList)malloc(sizeof(PolyNode));
	(*lc)->next = NULL; r=(*lc);
	
	pa=la->next; pb=lb->next;
	while((pa!=NULL)&&(pb!=NULL)){
		
		if(pa->zs < pb->zs){
			//复制la的当前元素节点
			    pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				 pc->zs=pa->zs;
				 pc->xs=pa->xs; 
			//把新节点加入lc 
				r->next=pc; r=pc;
				pa=pa->next;
			
		}else if(pa->zs == pb->zs){
			//将两个系数相加和赋值给变量sum
			int sum;
			sum=pa->xs+pb->xs;

			if(sum!=0){
				//生成新节点并适当赋值;
				pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				pc->xs=sum; pc->zs=pa->zs;
				//把新节点加入lc
				r->next=pc; r=pc;
			}
			pa=pa->next;pb=pb->next;
		}else if(pa->zs > pb->zs){
			//复制lb的当前元素节点
			
			   pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				 pc->zs=pb->zs;
				 pc->xs=pb->xs;
			//把新节点加入lc 
			
				r->next=pc; r=pc;
				pb=pb->next;
		}
	}
	if(pa){
			pc->next=pa; 
	}else if(pb){
			pc->next=pb;
	}
}

void printList(PolyList l){//打印多项式 
	p=l->next;
	while(p){
		printf("\n%2d %2d",p->xs,p->zs);
		p=p->next;
	}
	printf("\n"); 
}
void oppositePolyList(PolyList *l){//多项式的系数取相反数 
	PolyList p=(*l)->next;
	while(p){
		p->xs=-p->xs;
		p=p->next;
	}
}
void subtractionPolyList(PolyList la,PolyList lb,PolyList *lc){//多项式减法 
	oppositePolyList(&lb);
	addPolyList(la,lb,lc);
	oppositePolyList(&lb);
}
void reverse (PolyList *l){//多项式逆置 
	PolyList p,q,r;
	p=*l;
	q=p->next;
	p->next=NULL; 
	while(q){
		r=q->next;
		q->next=p->next;
		p->next=q;
		q=r;
		if(r)
			r=r->next;
	}
}
int main(){
	PolyList la,lb,lc;
	createPolyList(&la);

	createPolyList(&lb);
	subtractionPolyList(la,lb,&lc);
	printf("\nla: ");
	printList(la);
	
	printf("\nlb: ");
	printList(lb);
	
	printf("\nlc: ");
	printList(lc);
	
	printf("\nre_lc: ");
	reverse(&lc); 
	printList(lc); 
	return 0;
}
/* 
样例输入 
7 0
3 1
9 8
5 17
0 0

8 1
22 7
-9 8
0 0
*/ 

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值