數據結構與算法----數學應用之一元多項式

PS:上一篇說了線性表的順序表和鏈式表表達,該片就寫一下應用到現實數學中去,一元多項式的加減。spa

一元多項式咱們在本子上能夠說是手到拈來,可是在電腦上用語言敲出來,估計這會讓不少人頭疼,好比下面的多項式指針

y1 = 9x^1  + 4x^3 + 6x^4code

y2 = 2x^3 + 4x^4 + 3x^7 + 3x^8blog

yz = y1 + y2 ;ci

效果圖數學

思路:

  1. 建立一個結構體,裏面只存連個數,一個是係數data,一個是次冪,至於x就不用存了,只在打印的時候寫上就OK了,
  2. 而後寫插入操做,注意必定要是有序的,方便在後期相加
  3. 兩個多項式相加就是合併,咱們能夠按照順序兩兩比較,先拿y1的第一個數和y2第一個比較,若是y1>y2,則把y2添加到yz,相反之,若是y1=y2則相加係數,按照y1(也可y2)加入yz,等全都比較事後,若是y1(y2)還有項的話,就把剩下的全都加載到yz中,其實就是直接把next指向y1(y2)便可。

1:結構體

定義一個結構體類型
在SlinkOnez調用變量是,都是
L->data;L->next;的形式it

typedef struct SlinkOne {
    int data;
    int cimi;
    struct SlinkOne *next;
} SlinkOne, *SlinkOnez;

2:初始化

/**c
 * 初始化
 * */
SlinkOnez initLink() {
    SlinkOnez L = (SlinkOnez) malloc(sizeof(SlinkOne));
    if (!L) {
        exit(-1);
    }
    L->next = NULL;
    return L;
}

3:插入操做

/**
 * 插入
 * */
int insertLink(SlinkOnez &L, int pos, int e, int cimi) {
    SlinkOnez p = L;
    int i = 0;
    while (p && i < pos-1) {
        p = p->next;
        i++;
    }
    if (!p || i > pos-1) {
        printf("單鏈表未被建立\n");
        return -1;
    }
    //建立一個新的結點,並賦值
    SlinkOnez s = (SlinkOnez) malloc(sizeof(SlinkOne));
    s->data = e;
    s->cimi = cimi;
    s->next = p->next;
    p->next = s;
    printf("插入成功\n");
    return 0;
}

4:打印所有數據

注意:我在這裏面加入了幾個判斷,一個是當p->next ==NULL時,後面的加號就不要了,若是次冪==0的話那就只打印係數,固然若是係數==0,那就不打印,下方並未給出。class

/**
 * 打印所有數據
 * */
void printL(SlinkOnez L) {
    SlinkOnez p = L->next;
    if (!p) {
        printf("單鏈表不成立或者爲NULL");
        return;
    }
    while (p) {
        if (p->next == NULL) {
            printf("%dX^%d", p->data, p->cimi);
        } else {
            if (p->cimi == 0) {
                printf("%d + ", p->data);
            } else {
                printf("%dX^%d + ", p->data, p->cimi);
            }
        }
        p = p->next;
    }
    printf("\n");
}

5:合併(重點)

注意:pz = p1;//往下走一個,這句話其實就至關於 pz = pz->next;變量

下面的所有代碼實現都是在我上面說的思路上一一對應的,只要有思路,問題就已經解決了一半了,im

/**
 * 合併
 * */
SlinkOnez mergeLink(SlinkOnez &Lz, SlinkOnez &L1, SlinkOnez &L2) {
    Lz->next=NULL;
    SlinkOnez pz = Lz;
    SlinkOnez p1 = L1->next;
    SlinkOnez p2 = L2->next;
    while (p1 && p2) {
        if (p1->cimi < p2->cimi) {
            pz->next = p1;
            pz = p1;//往下走一個
            p1 = p1->next;
        } else if (p1->cimi > p2->cimi) {
            pz->next = p2;
            pz = p2;//往下走一個
            p2 = p2->next;
        }else{
            if(0 !=(p1->data + p2->data)){
                p1->data = (p1->data+p2->data);//注意此處,重點,不能寫成pz->data,不然會把當前p的值給替換掉,而不是賦值給下一個指針的值
                pz->next = p1;
                pz = p1;//往下走一個
            }
            p1=p1->next;
            p2=p2->next;
        }
    }

    if (p1!=NULL){
        pz->next=p1;
    }
    if (p2!=NULL){
        pz->next=p2;
    }
    return Lz;
}

6:使用

int main() {
    //第一個多項式
    SlinkOnez L;
    L = initLink();
    insertLink(L, 1, 9, 1);
    insertLink(L, 2, 4, 3);
    insertLink(L, 3, 6, 4);
    printL(L);
    //第二個多項式
    SlinkOnez L2;
    L2 = initLink();
    insertLink(L2, 1, 2, 3);
    insertLink(L2, 2, 4, 4);
    insertLink(L2, 3, 3, 7);
    insertLink(L2, 4, 3, 8);
    printL(L2);
    //合併後多項式
    SlinkOnez L3;
    L3=initLink();
    L3=mergeLink(L3,L,L2);
    printL(L3);
    return 0;
}

相關文章
相關標籤/搜索