所實現的一元多項式的結構如下圖所示:
若只對多項式進行“求值”等不改變多項式係數和指數的運算,採用類似順序表的順序存儲結構即可,否則應採用鏈式存儲結構,本文因爲要進行一元多項式的加法,加法,乘法,故採用的是鏈式存儲結構
注意:本程序輸入表達式時,需要按照(x的次冪)升序輸入
Polynomail.h
#include<stdio.h>
#include<assert.h>
struct Node
{
int coef; //係數
int expn; //指數
};
//節點結構
typedef struct PolynNode
{
Node data;
struct PolynNode *link;
}PolynNode;
typedef PolynNode* Polynmail;
void InitPolyn (Polynmail &head);
void CreatPolyn(Polynmail &head, int n);
void push_back (Polynmail &head, PolynNode *s);
void ShowPolyn (Polynmail head);
void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb);
int lenth(Polynmail head);
void destory(Polynmail &head);
Polynomail.cpp
#include"Polynomail.h"
void InitPolyn(Polynmail &head)
{
PolynNode *s = new PolynNode;
assert(s != NULL);
s->data.coef = 0;
s->data.expn = -1;
s->link = NULL;
head = s;
}
void push_back(Polynmail &head, PolynNode *s)
{
PolynNode *p = head;
while (p->link != NULL)
{
p = p->link;
}
p->link = s;
}
//創建一元多項式
void CreatPolyn(Polynmail &head, int n)
{
int c;
int e;
for (int i = 0; i < n; ++i)
{
printf("請輸入第%d項的係數和指數 >", i + 1);
scanf_s("%d%d", &c, &e);
PolynNode *s = new PolynNode;
s->data.coef = c;
s->data.expn = e;
s->link = NULL;
push_back(head, s);
}
}
//打印一元多項式
void ShowPolyn(Polynmail head)
{
PolynNode *s = head->link;
while (s != NULL)
{
if (s->data.expn == 0)//5x^0 ---->5
{
printf("%d", s->data.coef);
}
else if (s->data.expn == 1)//5x^1---->5x
{
printf("%dx", s->data.coef);
}
else//正常結果直接打印
{
printf("%dx^%d", s->data.coef, s->data.expn);
}
//下一項存在且係數爲正數,需打印正號(負數會自帶符號)
s = s->link;
if (s != NULL && s->data.coef > 0)
{
printf("+");
}
}
printf("\n");
}
//表達式pa + pb的結果保存在head中
void AddPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
PolynNode *sa = pa->link;
PolynNode *sb = pb->link;
PolynNode *s;
while (sa != NULL && sb != NULL)
{
s = new PolynNode;
s->link = NULL;
//sa節點的指數 < sb節點的指數 ----------->
//1:將sa節點中的數據插入到結果中 2:指向下一個pa節點
if (sa->data.expn < sb->data.expn)
{
s->data.coef = sa->data.coef;
s->data.expn = sa->data.expn;
sa = sa->link;
}
//sa節點的指數 > sb節點的指數 ----------->
//1:將sb節點中的數據插入到結果中 2:指向下一個pb節點
else if (sa->data.expn > sb->data.expn)
{
s->data.coef = sb->data.coef;
s->data.expn = sb->data.expn;
sb = sb->link;
}
//sa節點的指數 == sb節點的指數
//1:將二者係數的和即相同的指數插入到結果中 2:pa、pb都指向下一個節點
else if (sa->data.expn == sb->data.expn)
{
s->data.coef = sb->data.coef + sa->data.coef;
s->data.expn = sb->data.expn;
sb = sb->link;
sa = sa->link;
}
//若所加結果的係數爲0,不用插入結果中,反之需要插入到結果中
if (s->data.coef != 0)
{
push_back(head, s);
}
}
//將pa 或者pb當中表達式較長的剩餘節點全部插入到結果中
if (sa != NULL)
{
while (sa != NULL)
{
s = new PolynNode;
s->link = NULL;
s->data.coef = sa->data.coef;
s->data.expn = sa->data.expn;
push_back(head, s);
sa = sa->link;
}
}
if (sb != NULL)
{
while (sb != NULL)
{
s = new PolynNode;
s->link = NULL;
s->data.coef = sb->data.coef;
s->data.expn = sb->data.expn;
push_back(head, s);
sb = sb->link;
}
}
}
//表達式pa - pb的結果保存在head中
void SubPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
PolynNode *sa = pa->link;
PolynNode *sb = pb->link;
PolynNode *s;
while (sa != NULL && sb != NULL)
{
s = new PolynNode;
s->link = NULL;
//sa - sb sa中存在而sb中不存在的節點,相減後爲正
if (sa->data.expn < sb->data.expn)
{
s->data.coef = sa->data.coef;
s->data.expn = sa->data.expn;
sa = sa->link;
}
//sa - sb sb中存在而sa中不存在的節點,相減後爲負
else if (sa->data.expn > sb->data.expn)
{
s->data.coef = -(sb->data.coef);
s->data.expn = sb->data.expn;
sb = sb->link;
}
//sa - sb 兩者都存在的節點,結果 = 二者相減後的結果
else if (sa->data.expn == sb->data.expn)
{
s->data.coef = sb->data.coef - sa->data.coef;
s->data.expn = sb->data.expn;
sb = sb->link;
sa = sa->link;
}
if (s->data.coef != 0)
{
push_back(head, s);
}
}
if (sa != NULL)
{
while (sa != NULL)
{
s = new PolynNode;
s->link = NULL;
s->data.coef = sa->data.coef;//sa - sb sa中存在而sb中不存在的節點,相減後爲正
s->data.expn = sa->data.expn;
push_back(head, s);
sa = sa->link;
}
}
if (sb != NULL)
{
while (sb != NULL)
{
s = new PolynNode;
s->link = NULL;
s->data.coef = -(sb->data.coef);//sa - sb sb中存在而sa中不存在的節點,相減後爲負
s->data.expn = sb->data.expn;
push_back(head, s);
sb = sb->link;
}
}
}
int lenth(Polynmail head)
{
int count = 0;
PolynNode *s = head->link;
while (s != NULL)
{
count++;
s = s->link;
}
return count;
}
//表達式pa * pb的結果保存在head中
void MulPolyn(Polynmail &head, Polynmail pa, Polynmail pb)
{
PolynNode *sb = pb->link;
while (sb != NULL)//sb中的每一個節點和sa中的所有節點相乘
{
PolynNode *sa = pa->link;//因爲sb的每個節點都要和sa中的全部節點相乘,所以sb的每個節點
while (sa != NULL) //相乘時,sa總要從頭開始
{
//創建相乘後的節點
PolynNode *p = new PolynNode;
p->data.coef = (sa->data.coef)*(sb->data.coef);//係數相乘
p->data.expn = (sa->data.expn)+(sb->data.expn);//指數相加
p->link = NULL;
//尋找已存在的節點中是否存在與剛創建的節點(指數)相同的節點
PolynNode *s = head->link;
while (s != NULL && (s->data.expn) != (p->data.expn))
{
s = s->link;
}
//不存在指數相同的節點,直接尾插即可
if (s == NULL)
{
push_back(head, p);
}
//存在指數相同的節點,修改係數即可
else
{
s->data.coef += p->data.coef;
}
//(sb的當前節點)爲乘以sa中的下一個節點做準備
sa = sa->link;
}
//爲sb中的下一個節點乘以sa的全部節點做準備
sb = sb->link;
}
}
void destory(Polynmail &head)
{
PolynNode *s = head->link;
while (s != NULL)
{
head->link = s->link;
delete s;
s = head->link;
}
delete head;
head = NULL;
}
main.cpp
#include"Polynomail.h"
#include<cstdlib>
int main()
{
Polynmail pa;
Polynmail pb;
Polynmail pc;
InitPolyn(pa);
InitPolyn(pb);
InitPolyn(pc);
int select = 1;
int n;
while (select)
{
printf("*****************************************\n");
printf("* [1]創建多項式pa [2]創建多項式pb *\n");
printf("* [3]打印多項式pa [4]打印多項式pb *\n");
printf("* [5]AddPolyn [6]SubPolyn *\n");
printf("* [7]MulPolyn [8]打印多項式pc *\n");
printf("* [0]退出系統 [0]退出系統 *\n");
printf("*****************************************\n");
scanf_s("%d", &select);
switch (select)
{
case 1:
printf("請輸入多項式的項數:>");
scanf_s("%d", &n);
CreatPolyn(pa, n);
break;
case 2:
printf("請輸入多項式的項數:>");
scanf_s("%d", &n);
CreatPolyn(pb, n);
break;
case 3:
printf("pa = ");
ShowPolyn(pa);
break;
case 4:
printf("pb = ");
ShowPolyn(pb);
break;
case 5:
AddPolyn(pc, pa, pb);
break;
case 6:
SubPolyn(pc, pa, pb);
break;
case 7:
MulPolyn(pc, pa, pb);
break;
case 8:
printf("pc = ");
ShowPolyn(pc);
break;
default:
break;
}
}
destory(pa);
destory(pb);
destory(pc);
system("pause");
return 0;
}