數據結構:一元多項式計算器

這個我也是借鑑網上的,加了一些自己的理解,改了一些小東西,感覺還是菜逼,這要是不用這鬼指針寫多好,指針真的煩

以下的加了一些我理解代碼的註釋,希望能幫助理解

輸入的第一個多項式爲: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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章