一元多项式加减乘 (链表)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define LEN sizeof(node)
//定义结构体;
typedef struct s{
double coef; //系数;
int expn; //指数;
struct s *next; //定义指向结构体的指针;
}*link,node; //定义指针link,结构体node;
//生成结点;
link f(double coef,int expn){ //函数返回指向结构体的指针;
link p;
p=(link)malloc(LEN); //动态申请内存 p指针指向该内存;
p->coef =coef;
p->expn =expn;
p->next =NULL;
return p;
}
//清空链表;
link f0(link head){ //函数返回头指针 ,参数为头指针;
link p=head,q;
p=head->next;
while (p){
q=p->next;
free(p);
p=q;
}
// printf("%lf,%d",head->coef ,head->expn );
head->next=NULL;
return head;
}
//输入多项式按指数降幂 插入;
link sort(link head,link q){ //参数:为头指针、插入的结点;
link p,p1=NULL;
int i;
p=head;
p1=p;
// p=p->next;
if(!(p->next)){ //判断插入之前是否为空链表;
p->next = q;
return head;
}
else{
p=p->next;
while ((p!=NULL)&&(p->expn>=q->expn)){ //链表的中的结点存在 并且插入的数据中指数 小于原链表的指针;
if((p->expn==q->expn)&&(p->coef +q->coef==0)){ //如果插入的数据与原来的数据相加等于0(指数相同的情况下);
p1->next=p->next; //删除相加等于0的结点;
free(p); //释放结点;
free(q);
return head;
}
else if(p->expn==q->expn){ //插入的指数与原链表中某一项的指数相等但相加不等于0;
p->coef =p->coef+q->coef; //相同指数系数相加
return head;
}
p1=p;
p=p->next;
}
if(p==NULL) p1->next=q; //项数最小插入到尾链;
else{
p1->next=q;
q->next =p;
}
return head;
}
}
//建立多项式;
link f1(link head,int d){ //参数为头指针,第几个多项式;
int i,expn,n=0;
double coef;
link p= NULL,q=NULL;
head->next=NULL;
head->expn = 0;
p=head;
printf("请输入第%d个多项式的系数和指数(中间以逗号隔开 输入0,0结束): ",d);
scanf("%lf,%d",&coef,&expn);
while ((coef!=0)&&(expn!=0)){ //判断输入是否合法;
q = f(coef,expn); //调用f函数创建结点;
head=sort(head,q); //调用sort函数降幂插序;
printf("请输入第%d个多项式的系数和指数( 输入0,0结束): ",d);
scanf("%lf,%d",&coef,&expn);
}
return head;
}
//输出多项式;
void f2(link head,int d){
int i,n=0;
link p=NULL;
p=head;
p=p->next;
printf("多项式P%d(X)= ",d);
while (p){ //判断条件为p!=NULL;
n++; //标志变量,用于判