【資料結構 鏈表的應用】一元多項式相加及相乘 和對問題的分析,多項式相乘
一元多項式相乘,需要將一個多項式的每一項的指數與另一個多項式的每一項的指數相乘。
代碼實現:
標頭檔以及函式宣告:
#ifndef _POLYN_H #define _POLYN_H #include<iostream> #include <malloc.h>#include <stdio.h>using namespace std;#define _CRT_SECURE_NO_DEPRECATE#define NULL 0typedef struct NODE {float coef; //係數int expn; //指數struct NODE *next;}NODE;NODE *Creat(int n);void print(NODE *head);NODE *AddPolyn(NODE *head1, NODE *head2);NODE *Delfirst(NODE *head, NODE *q);void InsertBefore(NODE *p1, NODE *p2);int compare(int a, int b);NODE *CreatLinkList(int n);void menu();int inputnum(int n);//NODE *reverse(NODE *head);NODE *MulPolyn(NODE *A, NODE *B);bool SortDown(NODE *head);//排序bool SortUp(NODE *head);//排序void Judge(NODE *head,char x);#endif
函數定義:
#include "polyn.h"#include<iostream> void menu(){cout << " " << endl;cout << "**********************************" << endl;cout << "* [0] quit_system *" << endl;cout << "* [1] polynadd [2] polynmul *" << endl;cout << "**********************************" << endl;cout << "plese chose:>";}int inputnum(int n){while (n <= 0 ){cout<<"輸入的數值有誤,請確認輸入的數值為大於0的整數!: ";cin>>n;}return n;}/*建立鏈表*/NODE *Creat(int n){NODE *current, *previous, *head;int i;head = (NODE *)malloc(sizeof(NODE)); /*建立頭結點*/previous = head;for (i = 0; i < n; i++){current = (NODE *)malloc(sizeof(NODE));cout<<"請輸入係數和指數 : ";cin >> current->coef;cin>>current->expn;previous->next = current;previous = current;}previous->next = NULL;return head;}/*排序*/bool SortDown(NODE *head){NODE* p = NULL;NODE* q = NULL;for (p = head->next; p != NULL; p = p->next){for (q = p->next; q != NULL; q = q->next){if (p->expn < q->expn){p->expn = p->expn ^ q->expn;q->expn = p->expn ^ q->expn;p->expn = p->expn ^ q->expn;p->coef = p->coef + q->coef;q->coef = p->coef - q->coef;p->coef = p->coef - q->coef;}}}return true;}bool SortUp(NODE *head){NODE* p = NULL;NODE* q = NULL;for (p = head->next; p != NULL; p = p->next){for (q = p->next; q != NULL; q = q->next){if (p->expn > q->expn){p->expn = p->expn ^ q->expn;q->expn = p->expn ^ q->expn;p->expn = p->expn ^ q->expn;p->coef = p->coef + q->coef;q->coef = p->coef - q->coef;p->coef = p->coef - q->coef;}}}return true;}/*比較*/int compare(int a, int b){if (a < b)return -1;else if (a > b)return 1;elsereturn 0;}/*刪除結點q*/NODE *Delfirst(NODE *p1, NODE *q){p1->next = q->next;return (q);}/*插入結點,引入結點p,可以讓p插入到p2和p1之間*/void InsertBefore(NODE *p1, NODE *p2){NODE *p;p = p1->next;p1->next = p2;p2->next = p;}/*列印,為了美觀程式分開列印*/void print(NODE *head){SortDown(head);NODE *cur;cur = head->next;while (cur->next != NULL){cout<<cur->coef<<"*x^"<<cur->expn<< " + ";cur = cur->next;}cout << cur->coef << "*x^" << cur->expn ;cout << endl;}/*一元多項式的相加,總體考慮,可分qa的指數比qb小,或等於pb(如果係數相加等於0和不等於0),或大於pb裡面由InsertBefore和Delfirst兩個小模組組成一部分*/NODE *AddPolyn(NODE *head1, NODE *head2){NODE *ha, *hb, *qa, *qb;int a, b;float sum;ha = head1; /*ha和hb指向頭結點*/hb = head2;if (ha != NULL) //head1判斷是否為空白{if (hb == NULL){return head1;}else{qa = ha->next; /*qa和qb指向頭結點的下一個結點*/qb = hb->next;while (qa && qb) /*qa和qb均非空*/{a = qa->expn;b = qb->expn;switch (compare(a, b)) {case -1: /*qa->expn < qb->expn*/ha = qa;qa = qa->next;break;case 0:sum = qa->coef + qb->coef; /*係數的和*/if (sum != 0.0) { /*如果不是0.0*/qa->coef = sum; /*改變係數*/ha = qa;}else {free(Delfirst(ha, qa));}free(Delfirst(hb, qb));qa = ha->next;qb = hb->next; /*qb釋放後要重新賦值*/break;case 1: /*如果qa-> expn > qb -> expn*/Delfirst(hb, qb);InsertBefore(ha, qb); /*把qb插入到ha下一個結點之前*/qb = hb->next;ha = ha->next;break;}}}if (qb)ha->next = qb; /*插入剩餘的pb*/free(head2);return head1;}else{return head2;}}/*實現相加及建立多個一元多項式 */NODE *CreatLinkList(int n){int i, a;char x;NODE *head[100], *headsum; //長度為100的數組,足夠長了吧應該headsum = NULL;for (i = 1; i <= n; i++){cout << "\n請輸入第" << i << "個多項式的數目: ";//scanf_s("%d", &a);cin >> a;a = inputnum(a);cout << "(請按指數大小依次輸入係數和指數)" << endl;head[i] = Creat(a);//建立以head[i]為頭結點的鏈表cout << "下式是你所輸入的第" << i << "個多項式: " << endl;print(head[i]);cout << "請確認輸入是否正確,若有誤請輸入n重新輸入上式,正確請輸入y確認(小寫):"; //確認輸入cin >> x;if (x == 'n') //如果有誤則更正{if (i == 1) //如果第一項有誤i不減,將第一個一元多項式清空{head[i] = NULL;}else{ //如果不是第一項,將已輸入的多項式清空,並i減1 head[i] = NULL;//i--;}}headsum = AddPolyn(headsum, head[i]);//將各鏈表相加if (x == 'n') //如果第一項有誤i--{i--;}}return headsum;}/*一元多項式的相乘,需要將一個多項式的每一項的指數與另一個多項式的每一項的指數相加,並將係數相乘*/NODE *MulPolyn(NODE *A, NODE *B){NODE *pa, *pb, *pc, *u, *head;int k = 0;int maxExp = 0;//maxExp 為兩個鏈表指數和的最大值float coef = 0.0;head = (NODE *)malloc(sizeof(NODE));if (!head)return NULL;head->coef = 0.0;head->expn = 0;head->next = NULL;SortDown(A);SortDown(B);if (A->next != NULL && B->next != NULL)maxExp = (A->next->expn) + (B->next->expn);elsereturn head;pc = head;SortUp(B);for (k = maxExp; k >= 0; k--) /*確定多項式乘積的指數範圍為0到maxExp*/{pa = A->next;while (pa != NULL && pa->expn > k) /*找到Pa位置*/pa = pa->next;pb = B->next;while (pb != NULL && pa != NULL && (pa->expn + pb->expn) < k)/*如果和小於K,pb移動到下一個節點*/pb = pb->next;coef = 0.0;while (pa != NULL && pb != NULL){if ((pa->expn) + (pb->expn) == k){coef += (pa->coef) * (pb->coef);pa = pa->next;pb = pb->next;}else if ((pa->expn) + (pb->expn) > k) /*如果和大於K,pa移動到下一個節點*/pa = pa->next;elsepb = pb->next;/*如果和小於K,pb移動到下一個節點*/}if (coef != 0.0){/*如果係數不為0,則產生新的節點,並將係數和指數分別賦值給新節點,並插入到鏈表中*/u = (NODE*)malloc(sizeof(NODE));u->coef = coef;u->expn = k;u->next = pc->next;pc->next = u;pc = u;}}SortDown(B);return head;}
主函數:
#include "polyn.h"void main(int n){char y;NODE *headsum;NODE *headmul;int select = 1;NODE *A;NODE *B;int NumA = 0;int NumB = 0;menu();cin >> select;switch (select){case 1:/*相加*/cout << "****************************歡迎使用一元多項式相加程式******************" << endl;cout << "請輸入多項式的數目(大於0的整數): ";cin >> n;n = inputnum(n);headsum = CreatLinkList(n);cout << endl;cout << "相加後的多項式的顯示 : " << endl;print(headsum);cout << "****************************謝謝使用***********************************" << endl;cout << "繼續?請輸入(y/n): ";cin >> y;if (y == 'y'){main(1);}break;case 2:/*相乘*/cout << "****************************歡迎使用兩個一元多項式相乘程式******************" << endl;cout << "請輸入第1個多項式的數目:";cin >> NumA;cout << "(請按指數大小依次輸入係數和指數)" << endl;A = Creat(NumA);cout << "下式是你所輸入的第1個多項式: " << endl;print(A);cout << "請輸入第2個多項式的數目:";cin >> NumB;cout << "(請按指數大小依次輸入係數和指數)" << endl;B = Creat(NumB);cout << "下式是你所輸入的第1個多項式: " << endl;print(B);headsum = MulPolyn(A, B);cout << endl;cout << "相乘後的多項式的顯示 : " << endl;print(headsum);cout << "****************************謝謝使用***********************************" << endl;cout << "繼續請輸入(y/n): ";cin >> y;if (y == 'y'){main(1);}break;break;default:break;}}
運行結果如下: