一、链表结构定义:
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
float coef; //系数
int expn; //指数
struct Lnode *next;
}Lnode ,*Linklist;
对于多项式的运算,存在系数冲突(删除)和系数不冲突(插入)运算,所以使用链表最为方便。
并且,数据部分要定义一个系数和一个指数,将二者分开来记录。
二、多项式的创建
与单链表的创建类似,不过相对来说复杂一点,对于多项式可优先采用尾插法。
代码如下:
//尾插法建立多项式单链表
Linklist Create(Linklist &L){
Linklist rear,s;
L=(Linklist)malloc(sizeof(Lnode)); //申请头结点
L->next=NULL; //初始链表置空
rear=L; //尾插法的尾指针
float c; //取系数
int e,num;
for(int i=1;;i++){
printf("请输入第%d项的系数:",i);
scanf("%f",&c);
printf("请输入第%d项的指数:",i);
scanf("%d",&e);
if(c!=0){
s=(Linklist)malloc(sizeof(Lnode)); //申请新结点
s->coef=c; //以下是尾插步骤
s->expn=e;
rear->next=s;
rear=s;
}else{
break; //如果为0则跳出循环结束
}
}
rear->next=NULL; //一定要将创建好的最后结点的后续置空,否则系统将误判
printf("创建成功!");
return L;
}
运行结果:个人以输入0视为结束,大家可自定。
三、多项式的遍历
思路:从单链表第一个元素开始,逐项读出系数和指数,按多项式的形式进行输出。
但是,此过程口头叙述有点麻烦。
上图:
代码如下:
//多项式的输出
void Print(Linklist L){
Linklist p=L->next;
int flag=1; //定义标志是为了在第一个项式前不加'+’号
while(p){
if(p->coef>0&&flag!=1) { //输出'+'的条件,除了第一项不用加其余都要加
printf("+");
}
if(p->coef!=1&&p->coef!=-1){ //条件:系数不为1和-1
printf("%g",p->coef); //%g用来输出实数,自动选f格式或e格式
if(p->expn==1) putchar('X');
else if(p->expn) printf("X^%d",p->expn);
}else {
if(p->coef==1){ //条件:系数为1
if(!p->expn){
putchar('1'); }
if(p->expn==1){
putchar('X'); } else{ printf("X^%d",p->expn); }
}
if(p->coef==-1){ //条件:系数为-1
if(!p->expn){
printf("-1");
}
if(p->expn==1){
printf("-X");
}
if(p->expn){
printf("X%d",p->expn);
}
}
}
p=p->next; //结点遍历
flag++; //标志随项数增加而增加
}
printf("\n");
}
运行结果在上面创建时已经出现过。
四、多项式相加:
思路:分别创建好两个多项式,在一个新的链表中保存二者的逐项相加。
相加思路:
具体代码:
//多项式相加
Linklist ADD(Linklist A,Linklist B){
Linklist C,a,b,c,head;
a=A->next;
b=B->next;
C=(Linklist)malloc(sizeof(Lnode)); //C来存放A与B相加
head=C;
//当两个多项式都没有扫描结束时
while(a!=NULL&&b!=NULL){
c=(Linklist)malloc(sizeof(Lnode));
if(a->expn<b->expn){ //规则1
c->coef=a->coef;
c->expn=a->expn;
a=a->next;
}else
if(a->expn>b->expn){ //规则2
c->coef=b->coef;
c->expn=b->expn;
b=b->next;
}else
if(a->expn==b->expn){ //规则3
c->coef=a->coef+b->coef;
c->expn=a->expn;
a=a->next;
b=b->next;
}
if(c->coef!=0){ //规则4
c->next=head->next;
head->next=c;
head=c;
}else{
free(c);
}
}
while(a!=NULL){ //A还有剩余的项式,而B没有
c=(Linklist)malloc(sizeof(Lnode));
c->coef=a->coef;
c->expn=a->expn;
a=a->next;
c->next=head->next;
head->next=c;
head=c;
}
while(a!=NULL){ //B还有剩余的项式,而A没有
c=(Linklist)malloc(sizeof(Lnode));
c->coef=b->coef;
c->expn=b->expn;
b=b->next;
c->next=head->next;
head->next=c;
head=c;
}
head->next=NULL;
Print(C);
return C;
}
运行结果: 个人输入多项式均为 y=x+2x^2+3x^3,视觉方便。
五、多项式相减:
原理与相加类似。
代码:
//多项式相减
Linklist minus(Linklist A,Linklist B){
Linklist D,b,head;
b=B->next;
while(b){ //把B求相反数
b->coef=b->coef*(-1);
b=b->next;
}
head=B;
ADD(A,head); //调用相加函数,等价于相减
return 0;
}
运行结果:
六、多项式求值:
思路:使用math.h中的pow()函数来求指数的幂次方,然后再用num加总。
注:pow(x,y)=x的y次方 ,pow函数原型是double型的.
代码:
//多项式求值
int Get(Linklist A){
Linklist a;
a=A->next;
float n;
double num=0.0; //pow函数原型为double
printf("请输入X的值:");
scanf("%f",&n);
while(a!=NULL){
num=num+pow(n,a->expn)*a->coef; //num加总
a=a->next; //指针后移
}
printf("多项式的值为:");
printf("%f",num);
return num;
}
运行结果:
乘法,除法,以及求导目前还未涉及,往后会陆续补充。