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