當前位置:首頁 » 編程語言 » 一元多項式加法c語言

一元多項式加法c語言

發布時間: 2023-05-16 20:22:13

⑴ 一元多項式計算C語言

除以上功能外,還有乘法和除法的計算和導數計算呢。 這是我以前做的數據結構課程設計。希望能幫上你的忙。 #include<stdio.h> #include<malloc.h> typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial; //Polyn為結點指針類型 void Insert(Polyn p,Polyn h){ if(p->coef==0) free(p); //系數為0的話釋放結點 else{ Polyn q1,q2; q1=h;q2=h->next; while(q2&&p->expn<q2->expn){ //查找插入位置 q1=q2; q2=q2->next; } if(q2&&p->expn==q2->expn){ //將指數相同相合並 q2->coef+=p->coef; free(p); if(!q2->coef){ //系數為0的話釋放結點 q1->next=q2->next; free(q2); } } else{ //指數為新時將結點插入 p->next=q2; q1->next=p; } } }//Insert Polyn CreatePolyn(Polyn head,int m){//建立一個頭指針為head、項數為m的一元多項式 int i; Polyn p; p=head=(Polyn)malloc(sizeof(struct Polynomial)); head->next=NULL; for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial));//建立新結點以接收數據 printf("請輸入第%d項的系數與指數:",i+1); scanf("%f %d",&p->coef,&p->expn); Insert(p,head); //調用Insert函數插入結點 } return head; }//CreatePolyn void DestroyPolyn(Polyn p){//銷毀多項式p Polyn q1,q2; q1=p->next; q2=q1->next; while(q1->next){ free(q1); q1=q2;//指針後移 q2=q2->next; } } void PrintPolyn(Polyn P){ Polyn q=P->next; int flag=1;//項數計數器 if(!q) { //若多項式為空,輸出0 putchar('0'); printf("\n"); return; } while (q){ if(q->coef>0&&flag!=1) putchar('+'); //系數大於0且不是第一項 if(q->coef!=1&&q->coef!=-1){//系數非1或-1的普通情況 printf("%g",q->coef); if(q->expn==1) putchar('X'); else if(q->expn) printf("X^%d",q->expn); } else{ if(q->coef==1){ if(!q->expn) putchar('1'); else if(q->expn==1) putchar('X'); else printf("X^%d",q->expn); } if(q->coef==-1){ if(!q->expn) printf("-1"); else if(q->expn==1) printf("-X"); else printf("-X^%d",q->expn); } } q=q->next; flag++; }//while printf("\n"); }//PrintPolyn int compare(Polyn a,Polyn b){ if(a&&b){ if(!b||a->expn>b->expn) return 1; else if(!a||a->expn<b->expn) return -1; else return 0; } else if(!a&&b) return -1;//a多項式已空,但b多項式非空 else return 1;//b多項式已空,但a多項式非空 }//compare Polyn AddPolyn(Polyn pa,Polyn pb){//求解並建立多項式a+b,返回其頭指針 Polyn qa=pa->next; Polyn qb=pb->next; Polyn headc,hc,qc; hc=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 hc->next=NULL; headc=hc; while(qa||qb){ qc=(Polyn)malloc(sizeof(struct Polynomial)); switch(compare(qa,qb)){ case 1: { qc->coef=qa->coef; qc->expn=qa->expn; qa=qa->next; break; } case 0: { qc->coef=qa->coef+qb->coef; qc->expn=qa->expn; qa=qa->next; qb=qb->next; break; } case -1: { qc->coef=qb->coef; qc->expn=qb->expn; qb=qb->next; break; } }//switch if(qc->coef!=0){ qc->next=hc->next; hc->next=qc; hc=qc; } else free(qc);//當相加系數為0時,釋放該結點 }//while return headc; }//AddPolyn Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解並建立多項式a+b,返回其頭指針 Polyn h=pb; Polyn p=pb->next; Polyn pd; while(p){ //將pb的系數取反 p->coef*=-1; p=p->next; } pd=AddPolyn(pa,h); for(p=h->next;p;p=p->next) //恢復pb的系數 p->coef*=-1; return pd; }//SubtractPolyn float ValuePolyn(Polyn head,float x){//輸入x值,計算並返回多項式的值 Polyn p; int i; float sum=0,t; for(p=head->next;p;p=p->next){ t=1; for(i=p->expn;i!=0;){ if(i<0){t/=x;i++;}//指數小於0,進行除法 else{t*=x;i--;}//指數大於0,進行乘法 } sum+=p->coef*t; } return sum; }//ValuePolyn Polyn Derivative(Polyn head){//求解並建立a的導函數多項式,並返回其頭指針 Polyn q=head->next,p1,p2,hd; hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 hd->next=NULL; while(q){ if(q->expn!=0){ //該項不是常數項時 p2=(Polyn)malloc(sizeof(struct Polynomial)); p2->coef=q->coef*q->expn; p2->expn=q->expn-1; p2->next=p1->next;//連接結點 p1->next=p2; p1=p2; } q=q->next; } return hd; }//Dervative Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解並建立多項式a*b,返回其頭指針 Polyn hf,pf; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點 hf->next=NULL; for(;qa;qa=qa->next){ for(qb=pb->next;qb;qb=qb->next){ pf=(Polyn)malloc(sizeof(struct Polynomial)); pf->coef=qa->coef*qb->coef; pf->expn=qa->expn+qb->expn; Insert(pf,hf);//調用Insert函數以合並指數相同的項 } } return hf; }//MultiplyPolyn void DevicePolyn(Polyn pa,Polyn pb){//求解並建立多項式a*b,返回其頭指針 Polyn hf,pf,af,temp1,temp2,q; Polyn qa=pa->next; Polyn qb=pb->next; hf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲商 hf->next=NULL; pf=(Polyn)malloc(sizeof(struct Polynomial));//建立頭結點,存儲余數 pf->next=NULL; temp1=(Polyn)malloc(sizeof(struct Polynomial)); temp1->next=NULL; temp2=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next=NULL; temp1=AddPolyn(temp1,pa); while(qa!=NULL&&qa->expn>=qb->expn){ temp2->next=(Polyn)malloc(sizeof(struct Polynomial)); temp2->next->coef=(qa->coef)/(qb->coef); temp2->next->expn=(qa->expn)-(qb->expn); Insert(temp2->next,hf); pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2)); qa=pa->next; temp2->next=NULL; } pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb)); pb=temp1; printf("商是:"); PrintPolyn(hf); printf("余數是:"); PrintPolyn(pf); }//DevicePolyn int main(){ int m,n,flag=0; float x; Polyn pa=0,pb=0,pc,pd,pe,pf;//定義各式的頭指針,pa與pb在使用前付初值NULL printf("請輸入a的項數:"); scanf("%d",&m); pa=CreatePolyn(pa,m);//建立多項式a printf("請輸入b的項數:"); scanf("%d",&n); pb=CreatePolyn(pb,n);//建立多項式a //輸出菜單 printf("**********************************************\n"); printf("操作提示:\n\t1.輸出多項式a和b\n\t2.建立多項式a+b\n\t3.建立多項式a-b\n"); printf("\t4.計算多項式a在x處的值\n\t5.求多項式a的導函數\n\t6.建立多項式a*b\n"); printf("\t7.建立多項式a/b\n\t8.退出\n**********************************************\n"); for(;;flag=0){ printf("執行操作"); scanf("%d",&flag); if(flag==1){ printf("多項式a:");PrintPolyn(pa); printf("多項式b:");PrintPolyn(pb);continue; } if(flag==2){ pc=AddPolyn(pa,pb); printf("多項式a+b:");PrintPolyn(pc); DestroyPolyn(pc);continue; } if(flag==3){ pd=SubtractPolyn(pa,pb); printf("多項式a-b:");PrintPolyn(pd); DestroyPolyn(pd);continue; } if(flag==4){ printf("輸入x的值:x="); scanf("%f",&x); printf("多項式a的值%g\n",ValuePolyn(pa,x));continue; } if(flag==5){ pe=Derivative(pa); printf("多項式a的導函數:");PrintPolyn(pe); DestroyPolyn(pe);continue; } if(flag==6){ pf=MultiplyPolyn(pa,pb); printf("多項式a*b:");PrintPolyn(pf); DestroyPolyn(pf);continue; } if(flag==7){ DevicePolyn(pa,pb); continue; } if(flag==8) break; if(flag<1||flag>8) printf("Error!!!\n");continue; }//for DestroyPolyn(pa); DestroyPolyn(pb); return 0; }

熱點內容
華為榮耀備忘錄文件夾 發布:2025-07-16 09:23:23 瀏覽:972
基於特徵匹配演算法 發布:2025-07-16 09:18:23 瀏覽:46
夢香神奇寶貝伺服器的ip 發布:2025-07-16 09:14:07 瀏覽:212
電子密碼手套箱是什麼 發布:2025-07-16 09:13:27 瀏覽:799
手機連接資料庫 發布:2025-07-16 09:13:23 瀏覽:132
廣東伺服器存儲虛擬主機 發布:2025-07-16 09:13:17 瀏覽:326
絕地逃亡電腦怎麼設置最低配置 發布:2025-07-16 09:10:50 瀏覽:425
聯想z5的配置如何 發布:2025-07-16 09:08:21 瀏覽:879
電腦加密軟體哪個好 發布:2025-07-16 09:05:47 瀏覽:320
王者榮耀攻速疊加演算法 發布:2025-07-16 09:04:23 瀏覽:945