P(x),Q(x)分别为两个一元稀疏多项式计算器,利用单链表存储。实现相加,相减,就地逆置两者之差。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef struct term
{
float coef;//系数
int expn;//次方
struct term *next;
}Position;
typedef struct
{
Position *head;
Position *tail;
int len;
}Linklist;
void Initlist(Linklist *l)
{
l->head=NULL;
l->tail=NULL;
l->len=0;
}
Position *create(Position *head,Linklist *l)
{
int m,i=1;
Position *p,*q;
head=(Position *)malloc(sizeof(Position));
p=q=head;
head->next=NULL;
printf("这个一元多项式共有几项:");
scanf("%d",&m);
l->head=head;
l->len=m;
while(i<=m)
{
p=(Position *)malloc(sizeof(Position));
printf("第%d项的系数:",i);
scanf("%f",&p->coef);
printf("第%d项的次方:",i);
scanf("%d",&p->expn);
q->next=p;
q=p;
i++;
}
q->next=NULL;
l->tail=q;
return head;
}
void output(Position *head)
{
Position *p;
p=head->next;
while(p)
{ printf("(%.2f)X^%d",p->coef,p->expn);
p=p->next;
if(p)
printf("+");
}
printf("\n----------------------------\n\n");
}
Position *Calculate_add(Position *P,Position *Q,Position *add)
{
float sum;
int a,b;
Position *pa,*pb,*pc,*q;
add=(Position *)malloc(sizeof(Position));
pa=P->next;
pb=Q->next;
q=pc=add;
while(pa&&pb)
{
a=pa->expn;b=pb->expn;
if(a<b)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pa->expn;
pc->coef=pa->coef;
pa=pa->next;
}
else if(b<a)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pb->expn;
pc->coef=pb->coef;
pb=pb->next;
}
else
{
sum=pa->coef+pb->coef;
if(sum)
{
pc=(Position *)malloc(sizeof(Position));
pc->coef=sum;
pc->expn=pa->expn;
pa=pa->next;
pb=pb->next;
}
else
{
pa=pa->next;
pb=pb->next;
continue;
}
}
q->next=pc;
q=pc;
}
while(pa)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pa->expn;
pc->coef=pa->coef;
pa=pa->next;
q->next=pc;
q=pc;
}
while(pb)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pb->expn;
pc->coef=pb->coef;
pb=pb->next;
q->next=pc;
q=pc;
}
q->next=NULL;
return add;
}
Position *Calculate_minus(Position *P,Position *Q,Position *minus)
{
float sum;
int a,b;
Position *pa,*pb,*pc,*q;
minus=(Position *)malloc(sizeof(Position));
pa=P->next;
pb=Q->next;
q=pc=minus;
while(pa&&pb)
{
a=pa->expn;b=pb->expn;
if(a<b)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pa->expn;
pc->coef=pa->coef;
pa=pa->next;
}
else if(b<a)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pb->expn;
pc->coef=-pb->coef;
pb=pb->next;
}
else
{
sum=pa->coef-pb->coef;
if(sum)
{
pc=(Position *)malloc(sizeof(Position));
pc->coef=sum;
pc->expn=pa->expn;
pa=pa->next;
pb=pb->next;
}
else
{
pa=pa->next;
pb=pb->next;
continue;
}
}
q->next=pc;
q=pc;
}
while(pa)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pa->expn;
pc->coef=pa->coef;
pa=pa->next;
q->next=pc;
q=pc;
}
while(pb)
{
pc=(Position *)malloc(sizeof(Position));
pc->expn=pb->expn;
pc->coef=pb->coef;
pb=pb->next;
q->next=pc;
q=pc;
}
q->next=NULL;
return minus;
}
int sort(Position *head)
{
Position *later,*pre,*member;
pre=head->next;
if(!pre&&!pre->next)
return ERROR;
float temp;
int t;
later=pre->next;
while(pre->next)
{
member=pre;
while(later)
{
if((member->expn) > (later->expn))
{
member=later;
}
later=(later->next);
}
t=pre->expn;
pre->expn=member->expn;
member->expn=t;
temp=pre->coef;
pre->coef=member->coef;
member->coef=temp;
pre=pre->next;
later=pre->next;
}
return OK;
}
void converse(Position *head)
{
Position *p,*q;
p=head->next;
head->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
void destroylist(Position *head)
{
Position *p,*q;
p=head;
while(p)
{
q=p->next;
free(p);
p=q;
}
head->next=NULL;
}
void main()
{
Linklist hp,hq;
Position *lp=NULL,*lq=NULL,*la=NULL;
printf("请输入P(x):\n");
lp=create(lp,&hp);
sort(lp);
printf("P(x):\n");
output(lp);
printf("请输入Q(x):\n");
lq=create(lq,&hq);
sort(lq);
printf("Q(x):\n");
output(lq);
la=Calculate_add(lp,lq,la);
printf("P(x)+Q(x):\n");
output(la);
la=Calculate_minus(lp,lq,la);
printf("P(x)-Q(x):\n");
output(la);
converse(la);
printf("逆置P(x)-Q(x):\n");
output(la);
destroylist(lp);
destroylist(lq);
destroylist(la);
printf("\n谢谢使用!\n\n");
}