資料結構 連結串列實現多項式加法,減法,乘法
阿新 • • 發佈:2018-12-24
加法和減法的實現都比較簡單,就是找同類項,但是不要忘了相加或相減係數為0的情況.....
乘法比較麻煩,想了想最終決定用插入排序變式來進行排序+同類項合併,即在插入的過程中進行合併....
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <malloc.h> using namespace std; typedef struct{ float coef;//係數 int expn;//指數 }term,ElemType; typedef struct LNode/*結點型別*/{ ElemType data; struct LNode *next; }LNode,*Link,*Position; typedef struct LinkList/*連結串列型別*/{ Link head,tail;/*分別指向線性連結串列中的頭結點和最後一個結點*/ int len; /*指示線性連結串列中資料元素的個數*/ }LinkList; //插入排序變式 void Insert_Sort (ElemType* a,int& Size) { int rlen=0; for (int i=0;i<Size;i++) { ElemType temp=a[i]; int j=rlen-1; while (j>=0&&a[j].expn>temp.expn) { a[j+1]=a[j]; j--; } if(a[j].expn==temp.expn) { a[j].coef+=temp.coef; continue; } a[j+1]=temp; rlen++; } Size=rlen; } //連結串列初始化 void InitList (Link& L) { L=(Link)malloc(sizeof(LNode)); L->next=NULL; } //連結串列的建立 void CreatePolyn(Link& L) { int m; printf("請輸入項數\n"); scanf("%d",&m); if(m==0) { L->next=NULL; return; } printf("請依次輸入%d項多項式的係數和指數\n",m); Link h; ElemType e; //輸入m項的係數和指數,建立表示一元多項式的有序連結串列P InitList(L); h=L; for(int i=1;i<=m;i++)//依次輸入m個非零項 { scanf("%f%d",&e.coef,&e.expn); Link New=(Link)malloc(sizeof(LNode)); New->data=e; h->next=New; New->next=NULL; h=New; } } //連結串列遍歷 void Traverse (Link& L) { Link p=L->next; if(p==NULL) { printf("多項式為空\n"); return; } while (p) { printf("%.1f*x^%d%c",p->data.coef,p->data.expn,p->next==NULL? '\n':'+'); p=p->next; } } //多項式加法 void Add (Link& L1,Link& L2,Link& L3) { InitList(L3); Link p1=L1->next,p2=L2->next,p3=L3; while (p1||p2) { Link New=(Link)malloc(sizeof(LNode)); if(p1&&p2&&p1->data.expn==p2->data.expn) { New->data.expn=p1->data.expn; if(p1->data.coef+p2->data.coef!=0) { New->data.coef=p1->data.coef+p2->data.coef; p1=p1->next; p2=p2->next; } else { p1=p1->next; p2=p2->next; continue; } } else if((p1&&p2&&p1->data.expn<p2->data.expn)||(p1&&!p2)) { New->data=p1->data; p1=p1->next; } else if((p1&&p2&&p2->data.expn<p1->data.expn)||(p2&&!p1)) { New->data=p2->data; p2=p2->next; } p3->next=New; New->next=NULL; p3=New; } printf("相加的結果為:\n"); Traverse(L3); } //多項式減法 void Sub (Link& L1,Link& L2,Link& L3) { InitList(L3); Link p1=L1->next,p2=L2->next,p3=L3; while (p1||p2) { Link New=(Link)malloc(sizeof(LNode)); if(p1&&p2&&p1->data.expn==p2->data.expn) { New->data.expn=p1->data.expn; if(p1->data.coef!=p2->data.coef) { New->data.coef=p1->data.coef-p2->data.coef; p1=p1->next; p2=p2->next; } else { p1=p1->next; p2=p2->next; continue; } } else if((p1&&p2&&p1->data.expn<p2->data.expn)||(p1&&!p2)) { New->data=p1->data; p1=p1->next; } else if((p1&&p2&&p2->data.expn<p1->data.expn)||(p2&&!p1)) { New->data=p2->data; p2=p2->next; } p3->next=New; New->next=NULL; p3=New; } printf("相減的結果為:\n"); Traverse(L3); } //多項式乘法 void Mul (Link& L1,Link& L2,Link& L3) { InitList(L3); Link p1=L1->next,p2=L2->next,p3=L3; ElemType d[10005]; int Size=0; for (Link t1=p1;t1!=NULL;t1=t1->next) { for (Link t2=p2;t2!=NULL;t2=t2->next) { d[Size].coef=t1->data.coef*t2->data.coef; d[Size++].expn=t1->data.expn+t2->data.expn; } } Insert_Sort(d,Size); for (int i=0;i<Size;i++) { if(d[i].coef==0) continue; Link New=(Link)malloc(sizeof(LNode)); New->data=d[i]; New->next=NULL; p3->next=New; p3=New; } printf("相乘的結果為:\n"); Traverse(L3); } int main() { Link Head1,Head2,Head3; CreatePolyn(Head1); CreatePolyn(Head2); Add(Head1,Head2,Head3); Sub(Head1,Head2,Head3); Mul(Head1,Head2,Head3); return 0; }