/*多项式相加*/
#include <stdio.h>
#include <malloc.h>
#define NULL 0
struct poly //设置结构体
{
int xi;
int zhi;
struct poly *next;
};
struct poly *jianli(void) //建立链表
{
struct poly *p1, *head1, *p2;
p1 = ( struct poly* )malloc( sizeof(struct poly ) );
printf( "请输入两个整数:/n" );
scanf( "%d %d",&p1->xi,&p1->zhi );
head1 = p1;
while( p1->xi != 0)
{
p2 = ( struct poly* )malloc( sizeof(struct poly) );
printf( "input two integers:/n" );
scanf("%d %d",&p2->xi,&p2->zhi);
p1->next=p2;
p1=p2;
}
p1->next = NULL;
return head1;
}
int list(struct poly *head) //求链表长度
{
struct poly *p;
int L=0;
p=head;
while(p->next!=NULL)
{
p=p->next;
L++;
}
return(L);
}
struct poly* paixu(struct poly *head) //对链表进行排序冒泡法
{
struct poly *p,*r,*q;
int i,j,L;
L=list(head);
r=p=q=head;
for(i=0;i<L;i++)
{
r=p=q=head;
for(j=0;j<(L-i);j++)
{
p=r->next;
if(p->zhi>r->zhi)
{
if(r==head)
{
head=p;
r->next=p->next;
head->next=r;
p=r;
r=head;
}
else
{
q->next=p;
r->next=p->next;
p->next=r;
p=r;
r=q->next;
}
}
q=r;
r=p;
}
}
return(head);
}
struct poly* jisuan(struct poly *head1,struct poly *head2 ) //多项式的相加
{
struct poly *p1,*p2,*r1,*r2;
p1=r1=head1;
p2=r2=head2;
while((p1->next!=0)||(p2->next!=0))
{
if(p1->zhi==p2->zhi)
{
p1->xi=(p1->xi)+(p2->xi);
r1=p1;
p2=p2->next;
free(r2);
r2=p2;
p1=p1->next;
}
else if(p1->zhi<p2->zhi)
{
if(head1==p1)
{
r2=r2->next;
p2->next=p1;
head1=p2;
r1=p2;
p2=r2;
}
else
{
r2=r2->next;
r1->next=p2;
p2->next=p1;
r1=p2;
p2=r2;
}
}
else if(p1->zhi>p2->zhi)
{
if(p1->next!=NULL)
{
r1=p1;
p1=p1->next;
}
else
if(p1->next==NULL)
{
r1=p1;
p1->next=p2;
r1->next=p2;
}
}
}
return head1;
}
void print(struct poly* head) //输出函数
{
struct poly* p;
p=head;
while(p->next!=NULL)
{
printf("%d %d ",p->xi,p->zhi);
p=p->next;
free(head);
head=p;
}
free(head);
}
int main()
{
struct poly *head1,*head_one,*head2,*head_two,*p;
printf("请输入多项式的每一项的系数与指数并以0 0为结束标志/n");
head1=jianli();
head_one=paixu(head1);
printf("/n请输入另一个多项式的每一项的系数与指数并以0 0为结束标志/n");
head2=jianli();
head_two=paixu(head2);
printf("相加后的多项式是:/n");
p=jisuan(head_one,head_two);
print(p);
return 0;
}