数据表示
用带头结点的链式表来表示多项式,每个结点对应多项式的一项
数据结构 | 标志 |
---|---|
指数域 | exp |
系数域 | coef |
指针域 | next |
typedef struct node
{
int exp;
float coef;
struct node* next;
}polynode;
步骤
1.当p1和p2都没到达尾部时,逐一取出p1、p2指向的结点的指数值
- 如果相等,则把系数相加
- 如果不等的话,取较小的放在C后面
while(p1&&p2)
{
if(p1->exp<p2->exp)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else if(p1->exp>p2->exp)
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
else if(p1->exp==p2->exp)
{
sum=p1->coef+p2->coef;
if(sum)
{
p1->coef=sum;
p3->next=p1;
p3=p1;
p1=p1->next;
r=p2;
p2=p2->next;
free(r);
}
else//sum为0
{
r=p2;
p2=p2->next;
free(r);
r=p1;
p1=p1->next;
free(r);
}
}
}
2.当p1和p2有一个到达尾部时
if(p1)
{
p3->next=p1;
}
if(p2)
{
p3->next=p2;
}
3.释放B的头结点
free(B);
创建一元多项式(顺序建表)
polynode * CREATELIST_R(int n)
{
polynode *head,*r;
head = (polynode*)malloc(sizeof(polynode));
head->exp=-1;
head->next=NULL;
r=head;
for(int i=1;i<=n;i++)
{
printf("input (coef exp):\n");
scanf("%f %d",&&cc,&ee);
INSERT_AFTER(r,cc,ee);
}
return head;
}
代码
typedef struct pnode
{
int exp;
float coef;
struct pnode* next;
}polynode;
void INSERT_AFTER(polynode *p,float cc,int ee)
{
polynode *s;
s=(polynode *)malloc(sizeof(polynode));
s->coef=cc;
s->exp=ee;
s->next=p->next;
p->next=s;
}
polynode * CREATELIST_R(int n)
{
polynode *head,*r;
head = (polynode*)malloc(sizeof(polynode));
head->exp=-1;
head->next=NULL;
r=head;
for(int i=1;i<=n;i++)
{
printf("input (coef exp):\n");
scanf("%f %d",&&cc,&ee);
INSERT_AFTER(r,cc,ee);
}
return head;
}
void OUT(polynode *head)
{
polynode *p;
p = head->next;
while(p)
{
printf("%2fx^%d",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
polynode * POLYADD(polynode *A,polynode *B)
{
polynode *C,p1,p2,p3,*r;
C=A;
p3=C;
p1=A->next;
p2=B->next;
while(p1&&p2)
{
if(p1->exp<p2->exp)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else if(p1->exp>p2->exp)
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
else if(p1->exp==p2->exp)
{
sum=p1->coef+p2->coef;
if(sum)
{
p1->coef=sum;
p3->next=p1;
p3=p1;
p1=p1->next;
r=p2;
p2=p2->next;
free(r);
}
else//sum为0
{
r=p2;
p2=p2->next;
free(r);
r=p1;
p1=p1->next;
free(r);
}
}
}
if(p1)
{
p3->next=p1;
}
if(p2)
{
p3->next=p2;
}
free(B);
}