線性表--一元多項式相加
任務:本程式是一個控制檯程式,使用者可以根據自己的需求輸入兩個一元多項式,並且能夠實現顯示兩個多項式,再將這兩個多項式相加,輸出結果。
注意:本程式的輸入需求是按照指數的從小到大進行輸入,並且項數必須為正整數,指數需為整數,係數為雙精度型且不能為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;
}
總結:程式碼有點冗長,但是真正的看懂之後其實並不複雜,需要大家靜下心來細細分析。