五、一元多项式相加
五、一元多項式相加
文章目錄
- 五、一元多項式相加
- 題目描述
- 解題思路
- 上機代碼
題目描述
編寫一元多項式加法運算程序。要求用線性鏈表存儲一元多項式(參照課本)。該程序有以下幾個功能:
1、多項式求和
- 輸入:輸入三個多項式,建立三個多項式鏈表Pa、Pb、Pc
(提示:調用CreatePolyn(polynomial &P,int m)。
- 輸出:顯示三個輸入多項式Pa、Pb、Pc、和多項式Pa+Pb、多項式Pa+Pb+Pc
(提示:調用AddPolyn(polynomial &Pa, polynomial Pb), 調用PrintPolyn(polynomial P))。
0、退出
輸入:
根據所選功能的不同,輸入格式要求如下所示(第一個數據是功能選擇編號,參見測試用例):
-
1
- 多項式A包含的項數,以指數遞增的順序輸入多項式A各項的系數(整數)、指數(整數)
- 多項式B包含的項數,以指數遞增的順序輸入多項式B各項的系數(整數)、指數(整數)
- 多項式C包含的項數,以指數遞增的順序輸入多項式C各項的系數(整數)、指數(整數)
-
0
- 操作終止,退出。
輸出:
對應一組輸入,輸出一次操作的結果(參見測試用例)。
-
1
多項式輸出格式:以指數遞增的順序輸出: <系數,指數>,<系數,指數>,<系數,指數>,參見測試用例。零多項式的輸出格式為<0,0>
-
0
無輸出
| 測試用例 1 | 1 2 1 1 2 2 2 1 1 2 2 2 1 1 2 2 | <1,1>,<2,2> <1,1>,<2,2> <1,1>,<2,2> <2,1>,<4,2> < 3,1>,<6,2> | 1秒 | 1024KB | 0 |
| 測試用例 2 | 1 2 6 3 8 6 2 3 4 4 8 3 1 1 5 5 9 9 | <6,3>,<8,6> < 3,4>,<4,8> <1,1>,<5,5>,<9,9> <6,3>,< 3,4>,<8,6>,<4,8> <1,1>,<6,3>,< 3,4>,<5,5>,<8,6>,<4,8>,<9,9> | 1秒 | 1024KB | 0 |
| 測試用例 3 | 1 2 1 1 2 2 2 -1 1 -2 2 2 1 1 2 2 | <1,1>,<2,2> <-1,1>,<-2,2> <1,1>,<2,2> <0,0> <1,1>,<2,2> | 1秒 | 1024KB | 0 |
解題思路
教材上的解法挺好,就是顯得比較麻煩,需要調用的函數較多。這里我們采用鏈表的方式進行求解,實現三個函數即可:
- 構造多項式create()
- 多項式相加add()
- 打印多項式print()
其中多項式相加是核心,因為輸入是按指數遞增的順序,所以我們只需要分三種情況進行討論,直接求和就好。若某一個鏈表較長,還需要單獨遍歷后續結點。
還有一個要注意的點就是,零多項式的輸出是<0,0>,對于零多項式也需要建立結點
上機代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node {int ax, ex;//系數、指數struct node *next; }LinkNode, *LinkList;LinkList create(int);//構造多項式 LinkList add(LinkList, LinkList);//多項式相加 void print(LinkList);//打印多項式int main() {int T = 1;scanf("%d", &T);//0為假,1為真if(T){LinkList head1, head2, head3, p;//構造多項式int n=0;scanf("%d", &n);head1 = create(n);print(head1);scanf("%d", &n);head2 = create(n);print(head2);scanf("%d", &n);head3 = create(n);print(head3);//多項式相加并輸出p = add(head1, head2);print(p);p = add(p, head3);print(p);} return 0; }LinkList create(int n) {LinkList head, q;int ax=0, ex=0;//初始化頭結點head = (LinkList)malloc(sizeof(LinkNode));head->next=NULL;q = head;while(n--){scanf("%d%d", &ax, &ex);//尾插法建立鏈表LinkList p = (LinkList)malloc(sizeof(LinkNode));p->ax = ax;p->ex = ex;p->next = NULL;q->next = p;q = p;}//如果沒有輸入則置0if(q == head){LinkList p = (LinkList)malloc(sizeof(LinkNode));p->ax = 0;p->ex = 0;p->next = NULL;q->next = p;q = p;}return head; }LinkList add(LinkList head1, LinkList head2) {/* 鏈表 head3 = head1 + head2 *///初始化頭結點LinkList head3, ans;head3 = (LinkList)malloc(sizeof(LinkNode));head3->next = NULL;ans = head3;LinkList p, q;p = head1->next;q= head2->next;/* 因為輸入按指數遞增的順序,直接開始求和即可, 分為三種情況討論:1. p指數小于q2. p指數大于q3. p指數等于q*/while(p != NULL && q != NULL){if(p->ex < q->ex)//p指數小于q{if(p->ax)//系數不為0才進行操作{//尾插法LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = p->ax;s->ex = p->ex;s->next = NULL;ans->next = s;ans = s;}p = p->next;}else if(p->ex > q->ex)//p指數大于q{if(q->ax){LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = q->ax;s->ex = q->ex;s->next = NULL;ans->next = s;ans = s;}q = q->next;}else//p指數等于q{if(p->ax + q->ax)//系數求和不為0才進行操作{LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = p->ax + q->ax;s->ex = p->ex;s->next = NULL;ans->next = s;ans = s;}p = p->next;q = q->next;}}//如果某一個鏈表較長,則需要單獨遍歷while(p != NULL){if(p->ax){LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = p->ax;s->ex = p->ex;s->next = NULL;ans->next = s;ans = s;}p = p->next;}while(q != NULL){if(q->ax){LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = q->ax;s->ex = q->ex;s->next = NULL;ans->next = s;ans = s;}q = q->next;}//如果求和的結果為0則置0if(ans == head3){LinkList s = (LinkList)malloc(sizeof(LinkNode));s->ax = 0;s->ex = 0;s->next = NULL;ans->next = s;ans = s;}return head3; }void print(LinkList p) {p = p->next;//越過頭結點while(p->next != NULL){printf("<%d,%d>,", p->ax, p->ex);p = p->next;}printf("<%d,%d>\n", p->ax, p->ex);//最后一個結點 }總結
- 上一篇: Win10安装Maven并更换阿里源
- 下一篇: 六、求循环小数