您的位置:首页 > 其它

顺序表应用之两个一元多项式求和

2016-02-18 23:09 573 查看
#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);
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: