问一个一元多项式计算器的加减问题,,
这是整个程序,用VC6.0编译的:#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <conio.h>
#define null 0
typedef struct polynode
{
int coef;
int exp;
struct polynode *next;
}node;
node *create()
{
node *h,*r,*s;
int c,e;
h=(node*)malloc(sizeof(node));
r=h;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
while(c!=0)
{
s=(node*)malloc(sizeof(node));
s->coef=c;
s->exp=e;
r->next=s;
r=s;
printf("coef:");
scanf("%d",&c);
printf("exp: ");
scanf("%d",&e);
}
r->next=NULL;
return(h);
}
void arrange(node *pa)
{
node *h=pa,*p,*q,*r;
for(p=pa;p->next!=NULL;p=p->next);
r=p;
for(h=pa;h->next!=r;)
{
for(p=h;p->next!=r&&p!=r;p=p->next)
if((p->next)->exp>(p->next->next)->exp)
{
q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;
}
}
void neipai(node *head)
{ node *p,*q,*r,*Q;
p=head;
if(head->next->next!=NULL)
{
for(q=p->next;q!=NULL;q=q->next)
for(p=q->next,r=q;p!=NULL;)
if(q->exp==p->exp)
{
q->coef=q->coef+p->coef;
r->next=p->next;
Q=p;p=p->next;
free(Q);
}
else
{
r=r->next;
p=p->next;
}
} }
void insert(node *head,node *s)
{
node *pre,*p;
pre=head;
p=pre->next;
while(p!=NULL)
{
if(p->exp > s->exp) break;
pre=p;
p=p->next;
}
s->next=p;
pre->next=s;
}
node *copyList(node *head)
{
node *l = NULL, *newHead;
newHead = (node *) malloc(sizeof(node));
newHead->next = NULL;
head = head->next;
while (head != NULL)
{
l = (node *) malloc(sizeof(node));
l->coef = head->coef;
l->exp = head->exp;
insert(newHead, l);
head = head->next;
}
return newHead;
}
void print(node *p)
{
while(p->next!=NULL)
{
p=p->next;
printf(" %d*x^%d",p->coef,p->exp);
}
}
void polyadd(node *ha, node *hb)
{
node *p,*q,*pre,*temp;
int sum;
p=ha->next;
q=hb->next;
pre=ha;
while(p!=NULL&&q!=NULL)
{
if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
pre->next=p;pre=pre->next;p=p->next;
temp=q;q=q->next;free(temp);
}
else
{
temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
else if(p->exp<q->exp)
{
pre->next=p;
pre=pre->next;
p=p->next;
}
else
{
pre->next=q;
pre=pre->next;
q=q->next;
}
}
if(p!=NULL)
pre->next=p;
else
pre->next=q;
}
void polysub(node *ha,node *hb)
{
node *p,*q,*pre,*temp,*x;
int sum;
p=ha->next;
q=hb->next;
x=q;
pre=ha;
while(x!=null)
{ x->coef=-x->coef;
x=x->next;}
while(p!=NULL&&q!=NULL)
{
if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
{
p->coef=sum;
pre->next=p;pre=pre->next;p=p->next;
temp=q;q=q->next;free(temp);
}
else
{
temp=p->next;free(p);p=temp;
temp=q->next;free(q);q=temp;
}
}
else if(p->exp<q->exp)
{
pre->next=p;
pre=pre->next;
p=p->next;
}
else
{
pre->next=q;
pre=pre->next;
q=q->next;
}
}
if(p!=NULL)
pre->next=p;
else
pre->next=q;
}
void main()
{
node *ha,*hb,*hc,*hd;
printf("please input the coef and exp of ha:\n");
ha=create();
arrange(ha);
neipai(ha);
hc=copyList(ha);
print(ha);
printf("\n");
printf("please input the coef and exp of hb:\n");
hb=create();
arrange(hb);
neipai(hb);
hd=copyList(hb);
print(hb);
printf("\n");
printf("add is :\n");
polyadd(ha,hb);
print(ha);
printf("\n");
printf("sub is :\n");
polysub(hc,hd);
print(hc);
getch();
}
我只看得懂加法我是怎么弄得,,减法是怎么操作的,求来个大神给我指导一下。。。
[解决办法]
抱歉,第一种方案是
:
一种方案,不管某一项系数,是否为零,都存储该项,不存储任何指数,
项数 = 最高项的指数 + 1
各项按照升序,或者降序存储。
同次项顺次相加,相减。
如果是项数少的减多的,那么较长的多项式,高次项,直接取相反数。其他项顺序相减
an x^n + .... + am x^m +....+ a1 x + a0
+) bm x^m +....+ b1 x + b0
---------------------------------------------------------
an x^n+.......+ (am+bm) x^m +.....(a1+b1) x +(a0+b0)
================================================================
an x^n + .... + am x^m +....+ a1 x + a0
-) bm x^m +....+ b1 x + b0
---------------------------------------------------------
an x^n+.......+ (am-bm) x^m +.....(a1-b1) x +(a0-b0)
===============================================================
am x^m +....+ a1 x + a0
-) bn x^n+.......+ bm x^m +....+ b1 x + b0
---------------------------------------------------------
-bn x^n+.......+(am-bm) x^m +.....+(a1-b1) x +(a0-b0)
另一种方案,同时存储指数和系数
如果存储时候已经排序,病合并同类项,
那么可以顺序比较指数,相同者系数相加,相减。
如果减数指数较高,减数中,没有和被减数相减的项,系数取为相反数,作为差的同一指数的项
计算中,结果为零的项,直接删除。