1.一元稀疏多项式
#include<stdio.h>
#define max 100
typedef struct node
{
int xishu,zhishu;
struct node *next;
char fuhao;
}lot,*lotcac;
----------------------------------------------------
int main()
{
lotcac create();
void print(lotcac);
lotcac addcac(lotcac,lotcac);
lotcac jiancac(lotcac,lotcac);
lotcac multipcac(lotcac,lotcac);
}
-------------------------------------------------
lotcac addcac(lotcac p,lotcac q)
{
lotcac add,r;
add=(lotcac)malloc(sizeof(lot));
add->next=NULL;
r=add;
m=p->next;
n=q->next;
while(m&&n)
{
if(m->zhishu==n->zhishu)
{
lotcac newnode=(lotcac)malloc(sizeof(lot));
newnode->zhishu=m->zhishu;
newnode->xishu=m->xishu+n->xishu;
r->next=newnode;
newnode->next=NULL;
r=newnode;
m=m->next;
n=n->next;
}
else if(m->zhishu>n->zhishu)
{
lotcac newnode=(lotcac)malloc(sizeof(lot));
newnode->zhishu=m->zhishu;
newnode->xishu=m->xishu;
r->next=newnode;
newnode->next=NULL;
r=newnode;
m=m->next;
}
else
{
lotcac newnode=(lotcac)malloc(sizeof(lot));
newnode->zhishu=n->zhishu;
newnode->xishu=n->xishu;
r->next=newnode;
newnode->next=NULL;
r=newnode;
n=n->next;
}
}
while(m)
{
lotcac newnode=(lotcac)malloc(sizeof(lot));
newnode->zhishu=m->zhishu;
newnode->xishu=m->xishu;
r->next=newnode;
newnode->next=NULL;
r=newnode;
m=m->next;
}
while(n)
{
lotcac newnode=(lotcac)malloc(sizeof(lot));
newnode->zhishu=n->zhishu;
newnode->xishu=n->xishu;
r->next=newnode;
newnode->next=NULL;
r=newnode;
n=n->next;
}
return add;
}
-----------------------------
void print(lotcac p)
{
if(p)
{
q=p->next;
while(q->next!=NULL)
{
printf("%dx^%d%c",p->xishu,p->zhishu,p->fuhao);
q=q->next;
}
printf("%dx%d\n",q->xishu,q->zhishu);
}
}
--------------------------------
lotcac create()
{
lotcac p=(lotcac)malloc(sizeof(lot));
p->next=NULL;
printf("请输入项数:\n");
scanf("%d",&n);
printf("请逐个输入多项式的每项系数、指数及其后面的符号,之间逗号隔开:\n");
for(int i=0;i<n;i++)
{
if(i<n-1)
{
printf("第%d项\n",i+1);
lotcac newnode=(lotcac)malloc(sizeof(lot));
scanf("%d,%d,%c",&newnode->xishu,&newnode->zhishu,&newnode->fuhao);
getchar();
}
else
{
printf("第%d项\n",i+1);
lotcac newnode=(lotcac)malloc(sizeof(lot));
scanf("%d,%d",&newnode->xishu,&newnode->zhishu);
}
q=p->next;
pre=p;
while(q)
{
if(q->zhishu>newnode->zhishu)
{
pre=q;
q=q->next;
}
else
{
break;
}
}
newnode->next=pre->next;
pre->next=newnode;
}
return p;
}
-----------------------------------------
Link Reverse(Link p)
{
Link head=p;
Link q1,q2;
q2=head->next;
head->next=NULL;
while(q2)
{
q1=q2;
q2=q2->next;
q1->next=head->next;
head->next=q1;
}
return head;
}
-----------------------------------------
Link MultiplyPolyn(Link A,Link B)
{
Link pa,pb,pc,s,head;
int k,maxExpn,minExpn;
float coef;
head=(Link)malloc(LEN);
head->next=NULL;
if(A->next!=NULL&&B->next!=NULL){
minExpn=A->next->expn+B->next->expn;
A=Reverse(A);
B=Reverse(B);
maxExpn=A->next->expn+B->next->expn;
}
else{
return head;
}
pc=head;
B=Reverse(B);
for(k = maxExpn;k>=minExpn;k--){
pa = A->next;
while(pa !=NULL&&pa->expn>k){
pa = pa->next;
}
pb = B->next;
while(pb!=NULL&&pa!=NULL&&pa->expn+pb->expn<k){
pb = pb->next;
}
coef=0.0;
while(pa!=NULL&&pb!=NULL){
if(pa->expn+pb->expn==k){
coef+=pa->coef*pb->coef;
pa=pa->next;
pb=pb->next;
}
else if(pa->expn+pb->expn>k)}
pa = pa->next;
}
else{
pb = pb->next;
}
}
if(coef!=0.0){
s=(Link)malloc(LEN);
s->coef=coef;
s->expn=k;
s->next=pc->next;
pc->next=s;
pc=s;
}
}
B = Reverse(B);
head=Reverse(head);
return head;
}
-------------------------------------------------
多项式在某点值和导函数比较简单就不写了