发布网友 发布时间:2024-07-21 23:12
共1个回答
热心网友 时间:2024-08-02 12:23
#include<stdio.h>//两个多项式也就是两个链表,相加后的链表我们不重新建立,而是在第一个链表的基础上,增加和删除,得到相加后的链表。
#include<malloc.h>
typedef struct node
{
float cofe;//系数
int expn;//指数
struct node *next;
}node,*tie;
#define LEN sizeof(node)
int main()
{
int n,m;//n表示第一个多项式的项的个数,m表示第二个多项式的项的个数
while((scanf("%d%d",&n,&m))!=EOF)
{
tie p1,p2,head,tou,t1,t2,h1;
head=NULL;
p1=(tie)malloc(LEN);
p1->next=head;
scanf("%f%d",&p1->cofe,&p1->expn);//输入系数和指数
p2=head=p1;
for(int i=1;i<n;i++)
{
p1=(tie)malloc(LEN);
scanf("%f%d",&p1->cofe,&p1->expn);
p1->next=NULL;
p2->next=p1;
p2=p1;
}//以上为将第一个多项式建立成链表
tou=NULL;
p1=(tie)malloc(LEN);
p1->next=tou;
scanf("%f%d",&p1->cofe,&p1->expn);//输入系数和指数
p2=tou=p1;
for( i=1;i<m;i++)
{
p1=(tie)malloc(LEN);
scanf("%f%d",&p1->cofe,&p1->expn);
p1->next=NULL;
p2->next=p1;
p2=p1;
}//以上为将第二个多项式建立成链表
t1=h1=head;
t2=tou;//t1,t2分别指向当前结点,h1起辅助作用,第二个链表我们不要,所以可以用tou做辅助作用
while(t1&&t2)//当前结点都不为空
{
if(t1->expn<t2->expn)//第一个链表的当前位置的指数小于第二个链表
{
h1=t1;
t1=t1->next;
}
else if(t1->expn>t2->expn)//第一个链表的当前位置的指数大于第二个链表
{
if(t1==head)//在第一个链表的头前插入元素
{
head=t2;
t2=t2->next;
tou->next=t1;
tou=t2;
}
else
{
tou=t2;
t2=t2->next;
tou->next=t1;
h1->next=tou;
h1=tou;
}
}
else if(t1->expn==t2->expn)//第一个链表的当前位置的指数等于第二个链表
{
float sum=t1->cofe+t2->cofe;
if(sum==0)
{
tou=t2;
t2=t2->next;
h1->next=t1->next;
t1=t1->next;
}
else
{
t1->cofe=sum;
h1=t1;
t1=t1->next;
tou=t2;
t2=t2->next;
}
}
}
if(t1==NULL)//第一个链表已结束,将第二个链表加到第一个链表末尾
h1->next=t2;
tie p3;//将相加后的链表打印出来
p3=head;
while(p3!=NULL)
{
if(p3->cofe<0)
printf("%fx^%d",p3->cofe,p3->expn);
else
printf("+%fx^%d",p3->cofe,p3->expn);
p3=p3->next;
}
}
}
例如:
3x^2+4x^3+5x^5
x+2x^4+6x^5
此题的思路就是:将两个按指数增长顺序的两个链表,假设指针t1,t2分别指向多项式A和B中当前进行比较的某个结点,比较这两个结点中的指针项,有三种情况:1.指针t1的指针值<指针t2的指针值,此时将t1向后移;2.指针t1的指针值>指针t2的指针值,此时将t2的结点加入t1的链表;3.当二者相等时,应判断系数的是否为0.