【数据结构】C++单链表实现多项式加法(直接输入多项式)
題目描述:
計(jì)算兩個(gè)多項(xiàng)式的和。
輸入:
輸入有兩行,每行為一個(gè)每項(xiàng)按照指數(shù)從大到小順序的多項(xiàng)式,多項(xiàng)式的每一項(xiàng)用mx^n表示,其中系數(shù)m為非0整數(shù),指數(shù)n是非負(fù)整數(shù)。
輸出:
輸出兩個(gè)多項(xiàng)式相加的結(jié)果,要求按照每項(xiàng)的指數(shù),從大到小順序輸出每項(xiàng)。如果某個(gè)指數(shù)的項(xiàng)在求和運(yùn)算中系數(shù)為0,則不輸出。如果和的每項(xiàng)系數(shù)均為0,則這兩個(gè)多項(xiàng)式求和為0,結(jié)果輸出0。
樣例1輸入:
15x^4+4x^3+7x^1
-7x^1-6x^0
樣例1輸出:
15x^4+4x^3-6x^0
樣例2輸入:
-1x^2-1x^1
1x^2+1x^1
樣例2輸出:
0
(題目來(lái)源:njucs.程設(shè)實(shí)驗(yàn).第四周,禁止作業(yè)抄襲,轉(zhuǎn)載請(qǐng)注明出處)
分析:本題重點(diǎn)在于多項(xiàng)式的輸入,這里我采用的是cin.peek()的方式,也就是讓編譯器看一眼緩沖區(qū)下一個(gè)輸入是否是換行符;然后分別用int和char類(lèi)型存放數(shù)據(jù)。多項(xiàng)式加法采取常規(guī)算法,用p1,p2兩個(gè)指針?lè)謩e遍歷兩個(gè)多項(xiàng)式,分類(lèi)討論三種情況后放到結(jié)果多項(xiàng)式中去,詳見(jiàn)注釋。
代碼如下:
#include<iostream> using namespace std;//定義多項(xiàng)式結(jié)構(gòu)體 struct Poly {int m;//系數(shù)int n;//指數(shù)Poly* next; };Poly* scanf() {char a, b, c, d, e;Poly* head = NULL;Poly* start = new Poly;//從字符串中讀取多項(xiàng)式系數(shù)和指數(shù),對(duì)負(fù)號(hào)做特判if (cin.peek() == '-'){char f;//f='-',a='x',b='^'cin >> f >> start->m >> a >> b >> start->n;start->m = -start->m;}else{//a='x',b='^'cin >> start->m >> a >> b >> start->n;}start->next = head;head = start;Poly* tail = start;if (cin.peek() != '\n'){while (cin >> c){Poly* p = new Poly;cin >> p->m >> d >> e >> p->n;//輸入有負(fù)號(hào)時(shí)將系數(shù)置為相反數(shù)if (c == '-')p->m = -p->m;//尾插法創(chuàng)建多項(xiàng)式鏈表p->next = tail->next;tail->next = p;tail = p;//采用cin.peek()的方法判斷換行if (cin.peek() == '\n')break;}}return head; }void printf(Poly* head) {//輸出結(jié)果為零時(shí)做特判if (head == NULL)cout << 0 << endl;else {//第一項(xiàng)要單獨(dú)輸出Poly* cur = head;cout << cur->m << "x^" << cur->n;cur = cur->next;while (cur != NULL){//第二項(xiàng)之后系數(shù)為負(fù)直接輸出,系數(shù)為正則要先輸出一個(gè)+號(hào)if (cur->m < 0)cout << cur->m << "x^" << cur->n;elsecout << "+" << cur->m << "x^" << cur->n;cur = cur->next;}cout << endl;} }Poly* Add_Poly(Poly* head1, Poly* head2) {Poly* head = NULL;Poly* p1 = head1;Poly* p2 = head2;Poly* tail = head;//使用p1,p2兩個(gè)指針?lè)謩e遍歷兩個(gè)多項(xiàng)式鏈表,有三種情況://p1所在項(xiàng)指數(shù)大于p2,直接尾插入結(jié)果多項(xiàng)式鏈表中//p2所在項(xiàng)指數(shù)大于p1,同理//所在項(xiàng)指數(shù)相等時(shí),系數(shù)相加,插入結(jié)果鏈表中(若系數(shù)等于零不輸出)while (p1 != NULL || p2 != NULL){if (p1->n > p2->n){Poly* p = new Poly;p->n = p1->n;p->m = p1->m;if (tail == NULL){p->next = NULL;head = p;tail = p;}else{p->next = tail->next;tail->next = p;tail = p;}p1 = p1->next;}if (p2->n > p1->n){Poly* p = new Poly;p->n = p2->n;p->m = p2->m;if (tail == NULL){p->next = NULL;head = p;tail = p;}else{p->next = tail->next;tail->next = p;tail = p;}p2 = p2->next;}if (p1->n == p2->n){Poly* p = new Poly;p->n = p1->n;p->m = p1->m+p2->m;if (p->m != 0){if (tail == NULL){p->next = NULL;head = p;tail = p;}else{p->next = tail->next;tail->next = p;tail = p;}}p1 = p1->next;p2 = p2->next;}//其中一個(gè)多項(xiàng)式遍歷完之后,將另一個(gè)多項(xiàng)式剩余項(xiàng)放入結(jié)果中if (p1 == NULL){while (p2 != NULL){Poly* p = new Poly;p->n = p2->n;p->m = p2->m;if (tail == NULL){p->next = NULL;head = p;tail = p;}else{p->next = tail->next;tail->next = p;tail = p;}p2 = p2->next;}}if (p2 == NULL){while (p1 != NULL){Poly* p = new Poly;p->n = p1->n;p->m = p1->m;if (tail == NULL){p->next = NULL;head = p;tail = p;}else{p->next = tail->next;tail->next = p;tail = p;}p1 = p1->next;}}}return head; }int main() {Poly* head1 = scanf();Poly* head2 = scanf();printf(head1);printf(head2);printf(Add_Poly(head1, head2));return 0; }
程序運(yùn)行結(jié)果如下:
總結(jié):多項(xiàng)式問(wèn)題是數(shù)據(jù)結(jié)構(gòu)繞不開(kāi)的問(wèn)題,但本題和以往問(wèn)題的不同之處在于多項(xiàng)式是直接從鍵盤(pán)上輸入的,需要一個(gè)解析字符串并轉(zhuǎn)換到鏈表的過(guò)程,也可以用string類(lèi)來(lái)完成。能力有限,不足之處請(qǐng)指正!
總結(jié)
以上是生活随笔為你收集整理的【数据结构】C++单链表实现多项式加法(直接输入多项式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 互联网常识(持续更新)
- 下一篇: 【项目源码分享】基于C++实现的网店购物