/*
程式簡介:
功能:對多項式求值,求導,兩多項式相加,相減,相乘等運算
作者:xuqg
時間:2019.9.19
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct NodeType{
int id;//系數
int index;//指數
struct NodeType *next;
}Nodetype;
NodeType *CreatList();//建立一個人連結清單,用來存放一個多項式,傳回一個頭指針
void PrintList(NodeType *pHead);//輸出函數,輸出多項式的表達式
int Evaluation(NodeType *la,int x);//輸入x,求表達式的值
NodeType *TwoListAdd(NodeType *la,NodeType *lb);//兩個多項式求和
NodeType *MultipTwoList(NodeType *la,NodeType *lb);//兩個多項式求相減
NodeType *TwoListSubtract(NodeType *la,NodeType *lb);//兩個多項式相乘
NodeType *ListQiuDao(NodeType *la);//多項式求導
//主要是資料的測試
int main(){
NodeType *la;
printf("\n---------------------請輸入第一個多項式---------------------\n");
la = CreatList();
printf("第一個多項式的資訊為:");
PrintList(la);
NodeType *lb;
printf("\n---------------------請輸入第二個多項式---------------------\n");
lb = CreatList();
printf("第二個多項式的資訊為:");
PrintList(lb);
int x;
int a,b;
printf("請輸入x的值:");
scanf("%d",&x);
/*
a=Evaluation(la,x);
printf("suma=%d\n",a);
b=Evaluation(lb,x);
printf("sumb=%d\n",b);
printf("suma*sumb=%d\n",a*b);*/
NodeType *lf;
lf=MultipTwoList(la,lb);
printf("---------------------第一個與第二個多項式的乘法為---------------------\n");
PrintList(lf);/*
printf("第一個多項式的資訊為:\n");
PrintList(la);
printf("第二個多項式的資訊為:\n");
PrintList(lb);
a=Evaluation(lf,x);
printf("sumMU=%d\n",a);*/
NodeType *lc;
lc=TwoListAdd(la,lb);
printf("---------------------第一個與第二個多項式的和為---------------------\n");
PrintList(lc);
/*printf("第一個多項式的資訊為:\n");
PrintList(la);
printf("第二個多項式的資訊為:\n");
PrintList(lb);*/
NodeType *ld;
ld=TwoListSubtract(la,lb);
printf("第一個與第二個多項式的差為:\n");
PrintList(ld);
/*printf("第一個多項式的資訊為:\n");
PrintList(la);
printf("第二個多項式的資訊為:\n");
PrintList(lb);*/
NodeType *le=ListQiuDao(la);
printf("第一個求導的後的值為:\n");
PrintList(le);
/*printf("第一個多項式的資訊為:\n");
PrintList(la);
*/
return 0;
}
//建立一個人連結清單,用來存放一個多項式,傳回一個頭指針
//建立一個帶有頭結點的單連結清單,本代碼中的連結清單都是帶有頭結點的
NodeType *CreatList(){
NodeType *pNew,*pEnd;
NodeType *pHead = (NodeType *)malloc(sizeof(NodeType));
pHead->next = NULL;
pEnd = pHead;
printf("————注意要将指數按從小到大依次輸入————");
printf("請依次交叉輸入表達式id(系數)和index(指數)(id=0時退出):");
while(1){
int id,index;
pNew = (NodeType *)malloc(sizeof(NodeType));
scanf("%d",&id);
if(id == 0) break;
scanf("%d",&index);
pNew->id=id;
pNew->index=index;
pEnd->next = pNew;
pNew->next = NULL;
pEnd = pNew;
}
return pHead;
}
//輸出函數,輸出多項式的值
void PrintList(NodeType *pHead){
NodeType *pTemp = pHead->next;
while(pTemp!=NULL){
//當一個一進制多項式的系數(-1\1或其他)和指數(0或其他)不同時,輸出的格式不同
if(pTemp->id==1&&pTemp->index!=0) printf("x^%d",pTemp->index);
else if(fabs(pTemp->id)==1&&pTemp->index==0) printf("%d",pTemp->id);
else if(fabs(pTemp->id)==1&&pTemp->index!=0) printf("x^%d",pTemp->index);
else printf("%dx^%d",pTemp->id,pTemp->index);
pTemp = pTemp->next;
//輸出适當的+号和-
if(pTemp!=NULL&&pTemp->id>0) printf("+");
}
}
//兩個多項式求和
NodeType *TwoListAdd(NodeType *la,NodeType *lb){
NodeType *pa;
NodeType *pb;
NodeType *pc,*qc;
pa=la->next;
pb=lb->next;
NodeType *lc=(NodeType *)malloc(sizeof(NodeType));//建立一個帶頭結點的單連結清單用來存放來年各個多項式和的值
lc->next=NULL;
pc=lc;
//pa,pb不為NULL時,比較指數大小進行……
while(pa!=NULL&&pb!=NULL){//while{}
qc=(NodeType *)malloc(sizeof(NodeType));
if(pa->index<pb->index){
qc->id=pa->id;
qc->index=pa->index;
pa=pa->next;
pc->next=qc;
qc->next=NULL;
pc=qc;
}
else if(pa->index>pb->index){
qc->id=pb->id;
qc->index=pb->index;
pb=pb->next;
pc->next=qc;
qc->next=NULL;
pc=qc;
}
else{
qc->index=pa->index;
qc->id=pa->id+pb->id;
if(qc->id==0){
free(qc);
}
else{
pc->next=qc;
qc->next=NULL;
pc=qc;
}
pa=pa->next;
pb=pb->next;
}
}//while{}
while(pa!=NULL){
qc=(NodeType *)malloc(sizeof(NodeType));
qc->id=pa->id;
qc->index=pa->index;
pa=pa->next;
pc->next=qc;
qc->next=NULL;
pc=qc;
}
while(pb!=NULL){
qc=(NodeType *)malloc(sizeof(NodeType));
qc->id=pb->id;
qc->index=pb->index;
pb=pb->next;
pc->next=qc;
qc->next=NULL;
pc=qc;
}
return lc;
}
//兩個多項式求相減
NodeType *TwoListSubtract(NodeType *la,NodeType *lb){
NodeType *pb;
NodeType *ld;
pb=lb->next;
//将減數多項式lb系數變成相反數-lb,在求和就是兩個多項式相減
while(pb!=NULL){
pb->id=-pb->id;
pb=pb->next;
}
ld=TwoListAdd(la,lb);
//将pb指向頭指針,将lb的符号變回來
pb=lb->next;
while(pb!=NULL){
pb->id=-pb->id;
pb=pb->next;
}
return ld;
}
//多項式求導
NodeType *ListQiuDao(NodeType *la){
NodeType *le=(NodeType *)malloc(sizeof(NodeType));
NodeType *pe,*qe;
NodeType *pa=la->next;
le->next=NULL;
pe=le;
while(pa!=NULL){
//常數項的導數為零
if(pa->index!=0){
qe=(NodeType *)malloc(sizeof(NodeType));
qe->id=pa->id*pa->index;
qe->index=pa->index-1;
pe->next=qe;
qe->next=NULL;
pe=qe;
}
pa=pa->next;
}
return le;
}
//兩個多項式相乘
NodeType *MultipTwoList(NodeType *la,NodeType *lb){
NodeType *lf=(NodeType *)malloc(sizeof(NodeType));
lf->next=NULL;
NodeType *pa=la->next;
NodeType *pb;
//用一個多項式的一項分别乘以另一個多項式每一項,然後相加
while(pa!=NULL){
pb=lb->next;
NodeType *lalb=(NodeType *)malloc(sizeof(NodeType));
NodeType *pab,*qab;
lalb->next=NULL;
pab=lalb;
while(pb!=NULL){
qab=(NodeType *)malloc(sizeof(NodeType));
qab->id=pa->id*pb->id;
qab->index=pa->index+pb->index;
pab->next=qab;
pab->next->next=NULL;
pab=qab;
pb=pb->next;
}
lf=TwoListAdd(lf,lalb);
pa=pa->next;
}
return lf;
}
//輸入x,求表達式的值
int Evaluation(NodeType *la,int x){
NodeType *pa=la->next;
int sumla=0;
int sum;
while(pa!=NULL){
sum=1;
for(int i=0;i<pa->index;i++){
sum=sum*x;
}
sumla=sumla+pa->id*sum;
pa=pa->next;
}
return sumla;
}
https://mp.csdn.net/postedit/101036340