任务:本程序是一个控制台程序,用户可以根据自己的需求输入两个一元多项式,并且能够实现显示两个多项式,再将这两个多项式相加,输出结果。
注意:本程序的输入需求是按照指数的从小到大进行输入,并且项数必须为正整数,指数需为整数,系数为双精度型且不能为0。
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define null 0
typedef struct PLNODE{
float dbCoef; //系数域
int nExpn; //指数域
struct PLNODE * next; //指针域
}*linklist,LNODE; //PLNODE为一个新类型(是一个结构体),linkList为指向这样的结构体的指针
//创建一个空链表
linklist intlink(){
linklist p; //空链表 p
p=(PLNODE*)malloc(sizeof(PLNODE));
p->next=NULL;
return p;
}
//创建一个非空链表
linklist creatlink(linklist p,float a[],int b[],int n){
linklist r,s; //非空链表 r,s
int i;
r=p;
for(i=0;i<n;i++){
s=(PLNODE*)malloc(sizeof(PLNODE));
s->dbCoef=a[i];
s->nExpn=b[i];
r->next=s;
r=s;
}
r->next=NULL;
return p;
}
//链表长度
int length(linklist p){
int n=0;
linklist q=p->next;
while(q!= NULL){
n++;
q=q->next;
}
return n;
}
//比较指数
int compexpn(int expn1,int expn2){
if(expn1>expn2)
return -1;
else if(expn1==expn2)
return 0;
else
return 1;
}
//两个一元多项式相加
linklist addPolyn(linklist ha,linklist hb,linklist hc){
linklist la,lb,lc,r;
la=ha->next;
lb=hb->next;
float sum;
lc=hc;
while(la && lb){
switch(compexpn(la->nExpn,lb->nExpn)){
case -1:
r=(PLNODE*)malloc(sizeof(PLNODE));
r->dbCoef=la->dbCoef;
r->nExpn=la->nExpn;
lc->next=r;
lc=r;
r->next=NULL; //直到r的最后一个节点为空
la=la->next;
break;
case 0:
sum=la->dbCoef+lb->dbCoef;
if(sum!=0){
r=(PLNODE*)malloc(sizeof(PLNODE));
r->dbCoef=sum;
r->nExpn=la->nExpn;
lc->next=r;
lc=r;
r->next=null;
la=la->next;
lb=lb->next;
}
else{
la=la->next;
lb=lb->next;
}
break;
case 1:
r=(PLNODE*)malloc(sizeof(PLNODE));
r->dbCoef=lb->dbCoef;
r->nExpn=lb->nExpn;
lc->next=r;
lc=r;
r->next=null;
lb=lb->next;
break;
}
}
if(la){
r=(PLNODE*)malloc(sizeof(PLNODE));
r->dbCoef=la->dbCoef;
r->nExpn=la->nExpn;
lc->next=r;
lc=r;
r->next=null;
la=la->next;
}
if(lb){
r=(PLNODE*)malloc(sizeof(PLNODE));
r->dbCoef=lb->dbCoef;
r->nExpn=lb->nExpn;
lc->next=r;
lc=r;
r->next=null;
lb=lb->next;
}
return lc;
}
//打印出一元多项式
void display(linklist ha) {
if(ha==NULL)
printf("F(x)=0");
else{
int n=length(ha)-1;
ha=ha->next;
printf("F(x)=");
while(ha!=NULL){
printf("%.0fX^%d",ha->dbCoef,ha->nExpn);
ha=ha->next;
if(n!=0 && ha->dbCoef>0){
printf("+");
}
n--;
}
}
printf("\n");
}
int main(){
int len1,len2;
float m,a1[100],b1[100]; //a1里面放第一项各项系数 b1放第二项各项系数
int n,a2[100],b2[100]; //a2 b2 放指数
linklist A,B,C;
A=intlink();
B=intlink();
C=intlink();
printf("请输入第一个多项式的项数:\n");
scanf("%d",&len1);
for(int i=0;i<len1;i++){
printf("请输入第%d项系数:\n",i+1);
scanf("%f",&m);
a1[i]=m; //把输入第一项的各项系数放入数组a1中
printf("请输入第%d项指数:\n",i+1);
scanf("%d",&n); //把输入第一项的各项指数放入数组a2中
a2[i]=n;
}
printf("请输入第二个多项式的项数:\n");
scanf("%d",&len2);
for(int j=0;j<len2;j++){
printf("请输入第%d项系数:\n",j+1);
scanf("%f",&m);
b1[j]=m;
printf("请输入第%d项指数:\n",j+1);
scanf("%d",&n);
b2[j]=n;
}
creatlink(A,a1,a2,len1);
creatlink(B,b1,b2,len2);
printf("\n");
printf("第一个多项式为:\n");
display(A);
printf("\n");
printf("第二个多项式为:\n");
display(B);
addPolyn(A,B,C);
printf("\n");
printf("两个多项式相加为:\n");
display(C);
return 0;
}
总结:代码有点冗长,但是真正的看懂之后其实并不复杂,需要大家静下心来细细分析。