(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
*/