#include <stdio.h>
#include <malloc.h>
typedef struct node{
int coef;//系数
int exp;//指数
struct node *next;
}NODE;
NODE *creatPoly(){
int coef;
int exp;
NODE *head,*tail,*s;//链表头结点,尾结点,带插入的结点
//新建一个不含数据,指向第一个结点的头结点
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
//链表初始状态时候头尾结点指向一起
tail=head;
printf("请输入系数和指数,中间用逗号分开\n");
printf("ceof,exp: ");
scanf("%d,%d",&coef,&exp);
//printf("\n");
while(coef){
s=(NODE *)malloc(sizeof(NODE));
s->coef=coef;
s->exp=exp;
s->next=NULL;
tail->next=s;
tail=s;
fflush(stdin);//清除缓存
printf("ceof,exp: ");
scanf("%d,%d",&coef,&exp);
}
return head;
}
void printPoly(NODE *head){
NODE *node;
node=head->next;
printf("一元多项式为:");
while(node!=NULL){
printf("%d*X^%d ",node->coef,node->exp);
node=node->next;
}
printf("\n");
}
/*算法思路为将a,b一元多项式合并到a,然后返回a*/
NODE *polyAdd(NODE *poly_a,NODE *poly_b){
int sum;
NODE *p,*q,*pre,*temp;//定义poly_a,poly_b头结点指向的第一个结点p,q pre为p的前驱结点,temp为临时结点
p=poly_a->next;
q=poly_b->next;
pre=poly_a;//开始时pre就指向p的前驱
while(p&&q){
if(p->exp>q->exp){
temp=q->next;
q->next=p;
pre=q;
q=temp;
free(q);
} else if(p->exp==q->exp){
sum=p->coef+q->coef;
if(sum==0){
pre=p;
p=p->next;
temp=q;
q=q->next;
free(temp);
}else{
p->coef=sum;
pre=p;
p=p->next;
temp=q;
q=q->next;
free(temp);
}
}else{
pre=p;
p=p->next;
}
}
//如果q还没有结束,将q接在p链尾
if(q!=NULL){
pre->next=q;
free(q);
}
return poly_a;
}
int main(){
printf("请输入第一组一元多项式\n");
NODE *poly_a=creatPoly();
printPoly(poly_a);
printf("请输入第二组一元多项式\n");
NODE *poly_b=creatPoly();
printPoly(poly_b);
NODE *result=polyAdd(poly_a,poly_b);
printf("一元多项式相加\n")
printPoly(result);
}
顺序表应用之两个一元多项式求和
最新推荐文章于 2024-07-15 12:33:50 发布