無頭節(jié)點(diǎn)鏈表實(shí)現(xiàn) | 一元多項(xiàng)式加法蕊温、乘法

今天保研上機(jī)考快樂爆零??袱箱。出題大佬可能誤解了老年人的水平吧。
然后意識(shí)到义矛,PAT真的太新手友好了,我應(yīng)該珍惜盟萨。雖然emmmm大學(xué)科班好多年了凉翻,但是真的毫無專業(yè)能力。

一元多項(xiàng)式加法捻激、乘法題目鏈接

  • 多項(xiàng)式加法乘法用數(shù)組寫起來非常愉快制轰,???考慮到應(yīng)該練習(xí)一下鏈表的操作,又怕自己參考著參考著開始照抄胞谭,寫了一個(gè)無頭節(jié)點(diǎn)鏈表的版本垃杖。就很容易出現(xiàn)段錯(cuò)誤,或者申請(qǐng)了沒有free掉的情況(尤其操作頭部丈屹、有零多項(xiàng)式的時(shí)候)调俘。

    真的是以時(shí)間換空間啊(特喵的寫了好久旺垒,老是有詭異的段錯(cuò)誤)

  • 鏈表含頭節(jié)點(diǎn)的版本見浙大ds MOOC

  • 下面的實(shí)現(xiàn)基本練習(xí)到了增(??頭)彩库、刪(??頭)、改先蒋、線性查找骇钦。

#include <cstdio>
#include <cstdlib>

struct PNode {
    int value, exp;
    PNode *next;
};
typedef PNode *Ptr2Node;
typedef Ptr2Node Expression;

/* 對(duì)m次項(xiàng)
 *  若有次數(shù)相同項(xiàng),系數(shù)相加
 *      為0竞漾,則刪除該項(xiàng)
 *      不為0眯搭,則修改value
 *  若沒有,在最后一個(gè)次數(shù)大于m的項(xiàng)后插入
 */
void locate_and_insert(Expression &e, int exp, int val) {
    Ptr2Node p_res = e, pre = nullptr;
    while (p_res) {
        if (p_res->exp == exp) {
            //此處可以判0刪除
            p_res->value += val;
            return;
        }
        if (p_res->exp > exp) {
            pre = p_res;
            p_res = p_res->next;
        } else {
            //在pre和p_res之間插入
            Ptr2Node new_node = (Ptr2Node) malloc(sizeof(struct PNode));
            new_node->exp = exp, new_node->value = val;
            new_node->next = p_res;
            if (pre)
                pre->next = new_node;
            else e = new_node;
            return;
        }
    }
    // 當(dāng)前項(xiàng)次數(shù)比目前表達(dá)式結(jié)果中項(xiàng)的次數(shù)都要低业岁,在末尾插入 (pre不可能為空)
    Ptr2Node new_node = (Ptr2Node) malloc(sizeof(struct PNode));
    new_node->exp = exp, new_node->value = val;
    if (pre) pre->next = new_node;
    else e = new_node;
}

void delete_0_term(Expression &e) {
    // 注意:零多項(xiàng)式鳞仙、常數(shù)多項(xiàng)式!_督蟆繁扎!
    Ptr2Node curr = e, pre = nullptr;
    while (curr != nullptr) {
        if (curr->value == 0) {
            if (pre) {
                pre->next = curr->next;
                free(curr);
            } else e = e->next;
        }
        pre = curr;
        curr = curr->next;
    }
}

// with no head_node
Expression read_poly() {
    Expression e = (Expression) malloc(sizeof(struct PNode));
    e->next = nullptr;
    Ptr2Node curr = e, rear = nullptr;
    int tn, val, power;
    scanf("%d", &tn);
    for (int i = 0; i < tn; ++i) {
        scanf("%d%d", &val, &power);
        curr->value = val, curr->exp = power;
        rear = curr;
        curr->next = (Ptr2Node) malloc(sizeof(PNode));
        curr = curr->next;
    }
    free(curr);// 坑點(diǎn):需要把curr的上一個(gè)節(jié)點(diǎn)的next置為null(rear的作用)
    if (rear) rear->next = nullptr;
    else e = nullptr;
    return e;
}

Expression add(Expression e1, Expression e2) {
    Expression res = (Expression) malloc(sizeof(struct PNode));
    Ptr2Node p1 = e1, p2 = e2, p_res = res, rear = nullptr;
    while (p1 && p2) {
        if (p1->exp == p2->exp) {
            if (p1->value + p2->value != 0) {
                p_res->value = p1->value + p2->value;
                p_res->exp = p1->exp;
                rear = p_res;
                p_res->next = (Ptr2Node) malloc(sizeof(struct PNode));
                p_res = p_res->next;
            }
            p1 = p1->next;
            p2 = p2->next;
        } else if (p1->exp > p2->exp) {
            p_res->value = p1->value;
            p_res->exp = p1->exp;
            rear = p_res;
            p1 = p1->next;
            p_res->next = (Ptr2Node) malloc(sizeof(struct PNode));
            p_res = p_res->next;
        } else {
            p_res->value = p2->value;
            p_res->exp = p2->exp;
            rear = p_res;
            p2 = p2->next;
            p_res->next = (Ptr2Node) malloc(sizeof(struct PNode));
            p_res = p_res->next;
        }
    }
    free(p_res);
    if (rear) rear->next = nullptr;
    else res->next = nullptr;
    if (p1) {
        if (rear) rear->next = p1;
        else res = p1;
    } else if (p2) {
        if (rear) rear->next = p2;
        else res = p2;
    }
    return res;
}

void print_expression(Expression e) {
    Ptr2Node curr = e;
    if (curr == nullptr) {
        puts("0 0");
        return;
    }
    // with no head_node
    while (curr != nullptr) {
        printf("%d %d", curr->value, curr->exp);
        curr = curr->next;
        printf(curr != nullptr ? " " : "\n");
    }
}

/* 好xx麻煩
 * 先用e1的term1和e2所有項(xiàng)相乘,形成一個(gè)多項(xiàng)式,
 * 以此多項(xiàng)式為基礎(chǔ)做插入操作(伴隨著對(duì)次數(shù)的查找梳玫,同次的系數(shù)相加)
 * 相加后結(jié)果為0的話爹梁,刪除節(jié)點(diǎn)(練習(xí)刪除= =,或者可以保留提澎,在打印結(jié)果時(shí)跳過系數(shù)為0的項(xiàng))
 * */
Expression multiply(Expression e1, Expression e2) {
    Expression res = (Expression) malloc(sizeof(struct PNode));
    Ptr2Node p1 = e1, p2 = e2, p_res = res, rear = nullptr;
    if (p1) {
        while (p2) {
            p_res->exp = p1->exp + p2->exp;
            p_res->value = p1->value * p2->value;
            p2 = p2->next;
            p_res->next = (Ptr2Node) malloc(sizeof(struct PNode));
            rear = p_res;
            p_res = p_res->next;
        }
    }
    free(p_res);
    if (rear) rear->next = nullptr;
    if (p1) p1 = p1->next;
    while (p1) {
        p2 = e2;
        while (p2) {
            int t_val = p1->value * p2->value, t_exp = p1->exp + p2->exp;
            locate_and_insert(res, t_exp, t_val);
            p2 = p2->next;
        }
        p1 = p1->next;
    }
    delete_0_term(res);
    return res;
}

int main() {
    Expression e1, e2, add_e, mult_e;
    e1 = read_poly();
    e2 = read_poly();
    mult_e = multiply(e1, e2);
    print_expression(mult_e);
    add_e = add(e1, e2);
    print_expression(add_e);
    return 0;
}
測試點(diǎn)情況23333
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姚垃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盼忌,更是在濱河造成了極大的恐慌积糯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谦纱,死亡現(xiàn)場離奇詭異看成,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跨嘉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門川慌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祠乃,你說我怎么就攤上這事梦重。” “怎么了亮瓷?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵琴拧,是天一觀的道長。 經(jīng)常有香客問我嘱支,道長蚓胸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任斗塘,我火速辦了婚禮赢织,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馍盟。我一直安慰自己于置,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布贞岭。 她就那樣靜靜地躺著八毯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞄桨。 梳的紋絲不亂的頭發(fā)上话速,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音芯侥,去河邊找鬼泊交。 笑死乳讥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廓俭。 我是一名探鬼主播云石,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼研乒!你這毒婦竟也來了汹忠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤雹熬,失蹤者是張志新(化名)和其女友劉穎宽菜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竿报,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铅乡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烈菌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隆判。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僧界,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臭挽,我是刑警寧澤捂襟,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站欢峰,受9級(jí)特大地震影響葬荷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纽帖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一宠漩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懊直,春花似錦扒吁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至融撞,卻和暖如春盼铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尝偎。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工饶火, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹏控,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓肤寝,卻偏偏與公主長得像当辐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子醒陆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359