1. 程式人生 > >【資料結構】一元稀疏多項式計算器

【資料結構】一元稀疏多項式計算器

基本功能

  1. 一元多項式的加減
  2. 一元多項式的乘法
  3. 一元多項式的導數
  4. 一元多項式的輸出為類數學表示式

執行截圖:

在這裡插入圖片描述

原始碼:

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    float coef;//係數
    int expn;//指數
} Term;
typedef struct ploynomial
{
    Term term;
    ploynomial* next;
} ploynomial,*LinkList;
void InitList(LinkList &L)
{
    //初始化連結串列
L= (ploynomial*)malloc(sizeof(ploynomial));//頭結點 L->term.coef=0.0; L->term.expn=-1; L->next=NULL; } int cmp(Term a,Term b) { //比較結點的係數大小函式 if(a.expn>b.expn) return -1; else if(a.expn==b.expn) return 0; else return 1; } void insertNode(LinkList &L,Term e) { //將結點插入多項式連結串列的適當位置,可以同時起到建立連結串列和多項式相加的功能
ploynomial* q=L; while(q->next!=NULL) { if(cmp(q->next->term,e)<0)//如果當前結點q的下一個結點的指數 大於 要插入的結點的指數 q=q->next;//q指向下一個結點 else break;//此時, q.term.expn>e.expn >=q->next->term.expn } if(q->next!=NULL&&cmp(q->next->term,
e)==0) //指數相同,係數相加 { q->next->term.coef+=e.coef; } else { ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial)); node->term.coef=e.coef; node->term.expn=e.expn; if(q->next==NULL) node->next=NULL; //如果q結點為尾結點,則node的指標域設為NULL else node->next=q->next; //否則node的指標域指向q的下一個結點 q->next=node;//將node結點插入連結串列中 } } void CreatPolyn(LinkList &L,int m) { //輸入m項的係數和指數,建立表示一元多項式的有序連結串列L Term e; InitList(L); for(int i=1; i<=m; i++) { printf("\n第%d項的係數和指數:",i); scanf("%f%d",&e.coef,&e.expn); insertNode(L,e); } } void addPolyn(LinkList &L,LinkList L1,LinkList L2) { //用L返回L1+L2的結果 ploynomial* q; for(q=L1->next; q!=NULL; q=q->next) { insertNode(L,q->term);//將L1的每一項插入到L中 } for(q=L2->next; q!=NULL; q=q->next) //將L2的每一項插入到L中 { insertNode(L,q->term); } } void SubtracatPolyn(LinkList &L,LinkList L1,LinkList L2) { //用L返回L1-L2的結果 ploynomial* q; for(q=L1->next; q!=NULL; q=q->next) { insertNode(L,q->term);//將L1的每一項插入到L中 } for(q=L2->next; q!=NULL; q=q->next) { q->term.coef = -(q->term.coef); //把係數變成相反數,再進行相加操作,即為L1-L2 insertNode(L,q->term);//將L2的每一項插入到L中 } } void multiplyPolyn(LinkList &L,LinkList L1,LinkList L2) { //用L返回L1*L2的結果 ploynomial *p,*q; Term term; term.coef=0.0; term.expn=0; for(q=L1->next; q!=NULL; q=q->next) { for(p=L2->next; p!=NULL; p=p->next) { term.coef=(q->term.coef)*(p->term.coef);//係數相乘 term.expn=(q->term.expn)+(p->term.expn);// 指數想加 insertNode(L,term); } } } void derivativePolyn(LinkList &L,LinkList L1) { //用L返回L1的導數 ploynomial *p; Term term; for(p=L1->next; p!=NULL; p=p->next) { if(p->term.expn==0) { continue;//指數為0時,導數為0 ,跳過此次迴圈 } else { term.coef=(p->term.coef)*(p->term.expn); //係數乘以指數 term.expn=(p->term.expn)-1;//指數減一 insertNode(L,term); } } } void visitList(LinkList L) { //以類數學表示式的形式列印輸出一元多項式L, //即指數或者係數為1的情況下 省略1 ploynomial* q=L; int flag; while(q->next!=NULL) { q=q->next; flag=1; if(q->term.coef==0) continue;//係數為0 不輸出 if(q->term.expn==0&&flag==1) //指數為1 { if(q->term.coef>0) printf("+%.2f",q->term.coef); else printf("%.2f",q->term.coef); flag=0; } if((q->term.coef==1||q->term.coef==-1)&&flag==1)//係數為1 { if(q->term.expn==1){ if(q->term.coef==1) printf("+X"); else printf("-X"); }else{ if(q->term.coef==1) printf("+X^%d",q->term.expn); else printf("-X^%d",q->term.expn); } flag=0; } if(flag==1) { if(q->term.coef>0) printf("+%.2fX^%d",q->term.coef,q->term.expn); else printf("%.2fX^%d",q->term.coef,q->term.expn); } } printf("\n"); } int main() { LinkList L1,L2; int n1,n2; printf("請輸入多項式L1的項數:"); scanf("%d",&n1); CreatPolyn(L1,n1); printf("請輸入多項式L2的項數:"); scanf("%d",&n2); CreatPolyn(L2,n2); printf("\n多項式L1: "); visitList(L1); printf("\n多項式L2: "); visitList(L2); LinkList add,sub,multiply,derivative1,derivative2; InitList(add); InitList(sub); InitList(multiply); InitList(derivative1); InitList(derivative2); derivativePolyn(derivative1,L1); derivativePolyn(derivative2,L2); printf("\nL1的導數: "); visitList(derivative1); printf("\nL2的導數: "); visitList(derivative2); addPolyn(add,L1,L2); SubtracatPolyn(sub,L1,L2); multiplyPolyn(multiply,L1,L2); printf("\nL1 + L2: "); visitList(add); printf("\nL1 - L2: "); visitList(sub); printf("\nL1 * L2: "); visitList(multiply); }