国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

浙大數(shù)據(jù)結(jié)構(gòu)第二周02-線性結(jié)構(gòu)2 一元多項(xiàng)式的乘法與加法運(yùn)算

這篇具有很好參考價(jià)值的文章主要介紹了浙大數(shù)據(jù)結(jié)構(gòu)第二周02-線性結(jié)構(gòu)2 一元多項(xiàng)式的乘法與加法運(yùn)算。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目詳情:

設(shè)計(jì)函數(shù)分別求兩個(gè)一元多項(xiàng)式的乘積與和。

輸入格式:

輸入分2行,每行分別先給出多項(xiàng)式非零項(xiàng)的個(gè)數(shù),再以指數(shù)遞降方式輸入一個(gè)多項(xiàng)式非零項(xiàng)系數(shù)和指數(shù)(絕對(duì)值均為不超過1000的整數(shù))。數(shù)字間以空格分隔。

輸出格式:

輸出分2行,分別以指數(shù)遞降方式輸出乘積多項(xiàng)式以及和多項(xiàng)式非零項(xiàng)的系數(shù)和指數(shù)。數(shù)字間以空格分隔,但結(jié)尾不能有多余空格。零多項(xiàng)式應(yīng)輸出0 0。

輸入樣例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

輸出樣例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

主要思路:

求和的其實(shí)課本上講過了,就是分別遍歷L1和L2,

(1)兩者如果指數(shù)不等則將指數(shù)大的節(jié)點(diǎn)加入新鏈表,同時(shí)移動(dòng)新鏈表與加入節(jié)點(diǎn)的指針;

(2)兩者如果指數(shù)相等則系數(shù)相加,同時(shí)要判斷兩者是否為0,不為0時(shí)再把合并后接入新鏈表

(3)如果最后L1或L2有多余直接一次性接入

本題難點(diǎn)在于乘法

我的思路是利用之前實(shí)現(xiàn)的多項(xiàng)式加法函數(shù),將多項(xiàng)式乘法轉(zhuǎn)化為多項(xiàng)式加法

(1)用L1的每一項(xiàng)乘整個(gè)L2,得到一個(gè)多項(xiàng)式

(2)將新得到的多項(xiàng)式與L1前一項(xiàng)與整個(gè)L2相乘結(jié)果相加

如此便可以得到最終乘法結(jié)果

第一次寫錯(cuò)誤:

(1)每次遍歷鏈表時(shí)都會(huì)忘記移動(dòng)指針

(2)題目要求0多項(xiàng)式輸出0 0 ,所以首先系數(shù)如果是0就不要加入鏈表,最后如果鏈表為空打印鏈表時(shí)打印 0 0文章來源地址http://www.zghlxwxcb.cn/news/detail-536317.html

代碼實(shí)現(xiàn):

#include <stdio.h>
#include <stdlib.h>
/*鏈表表示多項(xiàng)式的數(shù)據(jù)結(jié)構(gòu)*/
typedef struct ListNode ListNode;
typedef ListNode* List;
struct ListNode {
    int Coefficient, Exponent;
    List Next;
};
/*實(shí)現(xiàn)尾插法的函數(shù)*/
void Attach(int coef, int expo, List* rear) {   //傳rear地址的原因是因?yàn)橐诤瘮?shù)里修改main函數(shù)必須通過地址進(jìn)行
    List newNode = (List)malloc(sizeof(ListNode));
    newNode->Coefficient = coef;
    newNode->Exponent = expo;
    (*rear)->Next = newNode;
    (*rear) = (*rear)->Next;
    (*rear)->Next = NULL;
}
/*用到尾插法構(gòu)造鏈表的函數(shù)*/
List CreateList(int degree) {
    List dummyHead = (List)malloc(sizeof(ListNode)); //多項(xiàng)式虛擬頭結(jié)點(diǎn)
    List rear = dummyHead;
    rear->Next = NULL;
    for(int i = 0; i < degree; i++) {  //創(chuàng)建多項(xiàng)式鏈表
        int coef, expo;
        scanf("%d %d", &coef, &expo);
        if(coef == 0) continue;
        Attach(coef, expo, &rear);
    }
    return dummyHead;
}


/*打印鏈表*/
void PrintList(List L) {
    List ptr = L->Next;
    if(ptr == NULL) printf("0 0");
    while(ptr) {
        printf("%d %d", ptr->Coefficient, ptr->Exponent);
        if(ptr->Next) printf(" ");
        ptr = ptr->Next;
    }
    return;
}
/*刪除鏈表*/
void DeleteList(List L) {
    List ptr = L->Next;
    while(ptr) {
        List tmp = ptr;
        ptr = ptr->Next;
        free(tmp);
    }
    free(L);
    return;
}
/*多項(xiàng)式加法,參數(shù)是兩個(gè)鏈表頭指針,不能操作傳進(jìn)來的鏈表*/
List AddPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    dummyHead->Next = NULL;
    List rear = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    while(ptr1 && ptr2) {
        int expo1 = ptr1->Exponent, expo2 = ptr2->Exponent;
        int coef1 = ptr1->Coefficient, coef2 = ptr2->Coefficient;
        if(expo1 > expo2) {
            Attach(coef1, expo1, &rear);
            ptr1 = ptr1->Next;
        }
        else if(expo1 < expo2) {
            Attach(coef2, expo2, &rear);
            ptr2 = ptr2->Next;
        }
        else {
            if((coef1 + coef2)) {
                Attach(coef1 + coef2, expo1, &rear);
            }
            ptr1 = ptr1->Next;
            ptr2 = ptr2->Next;
        }
    }
    
    if(ptr1) {
        while(ptr1) {
            Attach(ptr1->Coefficient, ptr1->Exponent, &rear);
            ptr1 = ptr1->Next;
        }
    }
    if(ptr2) {
        while(ptr2) {
            Attach(ptr2->Coefficient, ptr2->Exponent, &rear);
            ptr2 = ptr2->Next;
        }
    }
    return dummyHead;
}
/*多項(xiàng)式乘法,參數(shù)是兩個(gè)鏈表頭指針,不能操作傳進(jìn)來的鏈表*/
List ProductPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    List ptr0 = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    ptr0->Next = NULL;
    while(ptr2) {  
        int polyCoef2 = ptr2->Coefficient, polyExpo2 = ptr2->Exponent;
        List dummyHeadTmp = (List)malloc(sizeof(ListNode));
        List ptrTmp = dummyHeadTmp;
        ptrTmp->Next = NULL;
        while(ptr1) {   //將L2的每一項(xiàng)取出來,與L1相乘,得到一條tmp多項(xiàng)式鏈表
            int polyCoef1 = ptr1->Coefficient, polyExpo1 = ptr1->Exponent;
            int polyCoefTmp = polyCoef1 * polyCoef2;
            int polyExpoTmp = polyExpo1 + polyExpo2;
            if(polyCoefTmp == 0) continue;
            Attach(polyCoefTmp, polyExpoTmp, &ptrTmp);
            ptr1 = ptr1->Next;
        }
        dummyHead = AddPolynomial(dummyHead, dummyHeadTmp); //將這條tmp鏈表累加到結(jié)果鏈表上即可得到多項(xiàng)式乘法結(jié)果
        DeleteList(dummyHeadTmp);   //釋放tmp鏈表
        ptr1 = L1->Next;            //將ptr1重新指向L1
        ptr2 = ptr2->Next;          //ptr2指向L2的下一項(xiàng)
    }
    return dummyHead;
}
int main() {
    int degree1;
    scanf("%d", &degree1);
    List polynomial1 = CreateList(degree1);
    int degree2;
    scanf("%d", &degree2);
    List polynomial2 =  CreateList(degree2);
    List polynomialAdd = AddPolynomial(polynomial1, polynomial2);
    List polynomialPtrduct = ProductPolynomial(polynomial1, polynomial2);
    PrintList(polynomialPtrduct);
    printf("\n");
    PrintList(polynomialAdd);
    DeleteList(polynomial1);
    DeleteList(polynomial2);
    DeleteList(polynomialAdd);
    return 0;
}

到了這里,關(guān)于浙大數(shù)據(jù)結(jié)構(gòu)第二周02-線性結(jié)構(gòu)2 一元多項(xiàng)式的乘法與加法運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】第二章課后練習(xí)題——線性結(jié)構(gòu)

    【數(shù)據(jù)結(jié)構(gòu)】第二章課后練習(xí)題——線性結(jié)構(gòu)

    1、線性表是 一個(gè)有限序列,可以為空 2、鏈表中最常用的操作是在最后一個(gè)元素之后插入一個(gè)元素和刪除最后一個(gè)元素,則采用 單循環(huán)鏈表 存儲(chǔ)方式最節(jié)省運(yùn)算時(shí)間 3、若某線性表中最常用的操作實(shí)在最后一個(gè)元素之后插入一個(gè)元素和刪除第一個(gè)元素,則采用 僅有尾結(jié)點(diǎn)的

    2024年02月07日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(3)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(3)

    大家好,很高興又和大家見面了?。?! 在上一篇中,咱們介紹了順序表的基本概念,以及通過C語言實(shí)現(xiàn)順序表的創(chuàng)建和對(duì)表長(zhǎng)的修改。今天咱們將詳細(xì)介紹一下使用C語言實(shí)現(xiàn)順序表的增刪改查。接下來,跟我一起來看看今天的內(nèi)容吧?。。?我們先來回顧一下上一篇的內(nèi)容,

    2024年02月04日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(4)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(4)

    大家好,很高興又和大家見面啦?。?! 在前面的內(nèi)容中我們介紹了線性表的第一種存儲(chǔ)方式——順序存儲(chǔ),相信大家經(jīng)過前面的學(xué)習(xí)應(yīng)該已經(jīng)掌握了對(duì)順序表的一些基本操作了。今天,我們將開始介紹線性表的第二種存儲(chǔ)方式——鏈?zhǔn)酱鎯?chǔ)。 線性表中的數(shù)據(jù)元素在存儲(chǔ)時(shí),

    2024年02月04日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(2)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(2)

    大家好,很高興又和各位見面啦?。?!在上一個(gè)篇章中,我們簡(jiǎn)單了解了一下線性表的基礎(chǔ)知識(shí)以及一下重要的術(shù)語。在今天的篇章中我們將來開始正式介紹線性表的順序存儲(chǔ)——又稱順序表。我們將會(huì)在本章介紹什么是順序表,對(duì)于順序表的操作我們又應(yīng)該如何實(shí)現(xiàn)。接下

    2024年02月03日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(1)

    【數(shù)據(jù)結(jié)構(gòu)】第二章——線性表(1)

    大家好,很高興又和大家見面啦?。。慕裉扉_始,我們將進(jìn)入線性表的學(xué)習(xí)。 線性表是算法題命題的重點(diǎn)。這類算法題實(shí)現(xiàn)起來比較容易且代碼量較少,但是要求具有最優(yōu)的性能(時(shí)間復(fù)雜度、空間復(fù)雜度),因此,我們應(yīng)該牢固掌握線性表的各種基本操作(基于兩種存儲(chǔ)

    2024年02月03日
    瀏覽(29)
  • 扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之004 week01 02-04 使用泛型實(shí)現(xiàn)線性查找法

    在數(shù)組中逐個(gè)查找元素,即遍歷。 在 扎實(shí)打牢數(shù)據(jù)結(jié)構(gòu)算法根基,從此不怕算法面試系列之003 week01 02-03 代碼實(shí)現(xiàn)線性查找法中,我們實(shí)現(xiàn)了如下代碼: 之前實(shí)現(xiàn)的局限: 只支持int型。 需求: 支持所有的Java基本數(shù)據(jù)類型以及自定義的類類型。 很簡(jiǎn)單,很多語言都有這個(gè)處

    2023年04月16日
    瀏覽(25)
  • 浙大數(shù)據(jù)結(jié)構(gòu)之09-排序1 排序

    給定N個(gè)(長(zhǎng)整型范圍內(nèi)的)整數(shù),要求輸出從小到大排序后的結(jié)果。 本題旨在測(cè)試各種不同的排序算法在各種數(shù)據(jù)情況下的表現(xiàn)。各組測(cè)試數(shù)據(jù)特點(diǎn)如下: 數(shù)據(jù)1:只有1個(gè)元素; 數(shù)據(jù)2:11個(gè)不相同的整數(shù),測(cè)試基本正確性; 數(shù)據(jù)3:103個(gè)隨機(jī)整數(shù); 數(shù)據(jù)4:104個(gè)隨機(jī)整數(shù);

    2024年02月11日
    瀏覽(17)
  • 浙大數(shù)據(jù)結(jié)構(gòu)第六周之初識(shí)圖

    浙大數(shù)據(jù)結(jié)構(gòu)第六周之初識(shí)圖

    給定一個(gè)有N個(gè)頂點(diǎn)和E條邊的無向圖,請(qǐng)用DFS和BFS分別列出其所有的連通集。假設(shè)頂點(diǎn)從0到N?1編號(hào)。進(jìn)行搜索時(shí),假設(shè)我們總是從編號(hào)最小的頂點(diǎn)出發(fā),按編號(hào)遞增的順序訪問鄰接點(diǎn)。 輸入格式: 輸入第1行給出2個(gè)整數(shù)N(0N≤10)和E,分別是圖的頂點(diǎn)數(shù)和邊數(shù)。隨后E行,每行給

    2024年02月05日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】一元多項(xiàng)式的表示及相加

    【數(shù)據(jù)結(jié)構(gòu)】一元多項(xiàng)式的表示及相加

    ??博客主頁: 程序員好冰 ??歡迎 【點(diǎn)贊?? 關(guān)注?? 收藏?? 留言??】 ??本文由 程序員好冰 原創(chuàng),CSDN 首發(fā)! ??入站時(shí)間: ??2022 年 07 月 13 日?? ?? 是非不入松風(fēng)耳,花落花開只讀書。 ??推薦書籍:??《Java編程思想》,??《Java 核心技術(shù)卷》 ??參考在線編程網(wǎng)

    2024年02月11日
    瀏覽(23)
  • 浙大數(shù)據(jù)結(jié)構(gòu)第一周01-復(fù)雜度3 二分查找

    本題要求實(shí)現(xiàn)二分查找算法。 函數(shù)接口定義: 其中 List 結(jié)構(gòu)定義如下: L 是用戶傳入的一個(gè)線性表,其中 ElementType 元素可以通過、==、進(jìn)行比較,并且題目保證傳入的數(shù)據(jù)是遞增有序的。函數(shù) BinarySearch 要查找 X 在 Data 中的位置,即數(shù)組下標(biāo)(注意:元素從下標(biāo)1開始存儲(chǔ))

    2024年02月12日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包