這個我也是借鑑網上的,加了一些自己的理解,改了一些小東西,感覺還是菜逼,這要是不用這鬼指針寫多好,指針真的煩
以下的加了一些我理解代碼的註釋,希望能幫助理解
輸入的第一個多項式爲:2x^3-4x^5
輸入的第二個多項式爲:4x^4+4x^5
#include <stdio.h>
#include <stdlib.h>
typedef struct polynomial{
float coef;//係數
int expn;//指數
struct polynomial *next;
}polynomial;
void CreatePolyn(polynomial **p, int m){//p爲一個二級指針,
int i, data;
int flag;
polynomial *cp, *temp;
(*p) = (polynomial *)malloc(sizeof(polynomial));
(*p)->coef = 0.0;
(*p)->expn = -1;
(*p)->next = NULL;
for(i=1; i<=m; ++i){
cp = *p;//初始位置
flag = 0; //標誌多項式中是否已經存在相同指數的多項式
temp = (polynomial *)malloc(sizeof(polynomial));
printf("請輸入第%d項的係數:", i);
scanf("%f", &(temp->coef));
printf("請輸入第%d項的指數:", i);
scanf("%d", &(temp->expn));
while(cp->next && temp->expn > cp->next->expn){
cp = cp->next;
}
//相當於弄出一個指數遞增的多項式
if(cp->next && temp->expn == cp->next->expn){
continue;// 如果已經存在相同指數的多項式,忽略該項
}
temp->next = cp->next;
cp->next = temp;
}
}
// 打印多項式
void PrintPolyn(polynomial *p){
polynomial *temp = p->next;
int cnt=0;
while(temp){
if(cnt!=0&&temp->coef>0)printf("+");
printf("%.2fx^%d ", temp->coef, temp->expn);
cnt++;
temp = temp->next;
}
if(cnt==0)printf("0\n");//如果是空的輸出0
}
// 多項式加法
void AddPolyn(polynomial **pa, polynomial **pb){
polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
//用*p = (*pa),直接在pa上面進行修改
cpa = (*pa)->next;
cpb = (*pb)->next;
//這下面基本就是一個合併的過程,之前鏈表有練習有個合併的
while(cpa && cpb){
if(cpa->expn < cpb->expn){
p->next = cpa;
p = cpa;
cpa = cpa->next;
} else if(cpa->expn > cpb->expn) {
p->next = cpb;
p = cpb;
cpb = cpb->next;
} else {
if(cpa->coef + cpb->coef == 0){
temp = *pa;
while(temp->next != cpa)
temp = temp->next;
temp->next = cpa->next;
ccpa = cpa;
cpa = cpa->next;
cpb = cpb->next;
free(ccpa);
} else {
cpa->coef += cpb->coef;
p->next = cpa;
p = cpa;
cpa = cpa->next;
cpb = cpb->next;
}
}
}
if(cpa)
p->next = cpa;
else
p->next = cpb;
free(*pb);
}
// 多項式減法
void SubtractPolyn(polynomial **pa, polynomial **pb){
polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
cpa = (*pa)->next;
cpb = (*pb)->next;
while(cpa && cpb){
//puts("work?");
if(cpa->expn < cpb->expn){
p->next = cpa;
p = cpa;
cpa = cpa->next;
} else if(cpa->expn > cpb->expn) {
p->next = cpb;
p = cpb;
p->coef *= -1; // 改變係數的符號,將減數多項式的係數變爲負的
cpb = cpb->next;
} else { // cpa->expn == cpb->expn 指數相等
if(cpa->coef == cpb->coef){ //如果兩項係數相等,刪除該節點
temp = *pa;
while(temp->next != cpa)
temp = temp->next;
temp->next = cpa->next;
ccpa = cpa;
cpa = cpa->next;
cpb = cpb->next;
free(ccpa);
} else {
cpa->coef -= cpb->coef;
p->next = cpa;
p = cpa;
cpa = cpa->next;
cpb = cpb->next;
}
}
}
// 注意:cpa和cpb不是互斥關係,需分開兩個if分支,但最多隻有一個分支執行,可能同時不執行
if(cpa)
p->next = cpa;
if(cpb){
p->next = cpb;
while(cpb){
cpb->coef *= -1; // 改變係數的符號,將減數多項式的係數變爲負的
cpb = cpb->next;
}
}
free(*pb);
}
//將pb中的多項式複製到pa中
void CopyPolyn(polynomial **pa, polynomial *pb){
CreatePolyn(pa, 0);
polynomial *temp, *cpa;
cpa = *pa;
pb = pb->next; // 移動指針指向第一個節點
while(pb){
temp = (polynomial *)malloc(sizeof(polynomial));
temp->coef = pb->coef;
temp->expn = pb->expn;
temp->next = NULL;
cpa->next = temp;
cpa = temp;
pb = pb->next;
}
}
//pa爲多項式。pb爲單項式,與pa中的每一項相乘,結果保存到pa中
void MultiplyOperate(polynomial *pa, polynomial *pb){
pa = pa->next;
while(pa){
pa->coef *= pb->coef;
pa->expn += pb->expn;
pa = pa->next;
}
}
// 多項式乘法
void MultiplyPolyn(polynomial **pa, polynomial **pb){
// pa應該在此過程中保持不變,直到得到最後的結果
polynomial *cpa, *ccpa, *res;
cpa = *pa; //保存着原pa的內容
CreatePolyn(pa, 0); //從新初始化pa爲頭結點
(*pb) = (*pb)->next;
while(*pb){
CopyPolyn(&ccpa, cpa);//將cpa(內容是pa)複製到ccpa
MultiplyOperate(ccpa, *pb);//將ccpa分別與pb其中一項相乘
AddPolyn(pa, &ccpa);//將結果加入到pa中
(*pb) = (*pb)->next;
}
}
int main(){
printf("--------歡迎來到一元多項式計算器--------\n");
polynomial *pa, *pb;
int n,m;
printf("++++++++請輸入第一個多項式的項數:++++++++\n");
scanf("%d",&n);
CreatePolyn(&pa, n);
printf("++++++++請輸入第二個多項式的項數:++++++++\n");
scanf("%d",&m);
CreatePolyn(&pb, m);
printf("請選擇兩個多項是計算的方式\n");
printf("********************************\n");
int choose;
printf("1:相加 2:相減 3:相乘\n");
printf("********************************\n");
printf("請輸入:");
scanf("%d",&choose);
if(choose==1)
AddPolyn(&pa,&pb);
else if(choose==2)
SubtractPolyn(&pa, &pb);
else
MultiplyPolyn(&pa, &pb);
printf("計算結果如下:\n");
PrintPolyn(pa);
printf("\n");
return 0;
}